`
rys5851968
  • 浏览: 155750 次
社区版块
存档分类
最新评论

opencv 旋转图像函数实现 等同于matlab里的rotate() (注:旋转后图像变大,超出部分填为黑色)

 
阅读更多

注:clockwise=true 顺时针旋转

clockwise=false 逆时针旋转


IplImage* rotateImage(IplImage* src, int angle, bool clockwise)

{
angle = abs(angle) % 180;
if (angle > 90)
{
angle = 90 - (angle % 90);
}
IplImage* dst = NULL;
int width =
(double)(src->height * sin(angle * CV_PI / 180.0)) +
(double)(src->width * cos(angle * CV_PI / 180.0 )) + 1;
int height =
(double)(src->height * cos(angle * CV_PI / 180.0)) +
(double)(src->width * sin(angle * CV_PI / 180.0 )) + 1;
int tempLength = sqrt((double)src->width * src->width + src->height * src->height) + 10;
int tempX = (tempLength + 1) / 2 - src->width / 2;
int tempY = (tempLength + 1) / 2 - src->height / 2;
int flag = -1;

dst = cvCreateImage(cvSize(width, height), src->depth, src->nChannels);
cvZero(dst);
IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), src->depth, src->nChannels);
cvZero(temp);

cvSetImageROI(temp, cvRect(tempX, tempY, src->width, src->height));
cvCopy(src, temp, NULL);
cvResetImageROI(temp);

if (clockwise)
flag = 1;

float m[6];
int w = temp->width;
int h = temp->height;
m[0] = (float) cos(flag * angle * CV_PI / 180.);
m[1] = (float) sin(flag * angle * CV_PI / 180.);
m[3] = -m[1];
m[4] = m[0];
// 将旋转中心移至图像中间
m[2] = w * 0.5f;
m[5] = h * 0.5f;
//
CvMat M = cvMat(2, 3, CV_32F, m);
cvGetQuadrangleSubPix(temp, dst, &M);
cvReleaseImage(&temp);
return dst;
}
分享到:
评论

相关推荐

    基于opencv的图像旋转,功能类似matlab的imrotate函数

    本篇将深入探讨如何利用OpenCV实现图像的旋转,以及这一功能与MATLAB中的`imrotate`函数的相似性。 在OpenCV中,图像旋转主要通过`getRotationMatrix2D`和`warpAffine`或`warpPerspective`这两个函数来完成。`...

    C++中利用opencv来实现图片的旋转

    为了确保旋转后图像的大小不变,我们需要在原图像的基础上扩展一个新的边界,以容纳旋转后的图像。这可以通过设置`cv::Rect`对象来完成,该对象包含原图像的边界框和额外的边缘空间。 接下来,我们将应用`cv::...

    opencv 图像旋转 任一点坐标转换 裁剪图像

    在这个场景中,我们主要关注的是如何使用OpenCV来实现图像的旋转以及在旋转后对图像进行精确的裁剪。这涉及到两个关键知识点:图像的旋转操作和坐标转换。 首先,图像的旋转是图像几何变换的一种,通常我们使用...

    OpenCV图像旋转程序

    5. **图像边界处理**: 由于旋转可能会导致图像边缘超出原始边界,OpenCV提供了几种边界填充选项,如`BORDER_CONSTANT`(用固定值填充),`BORDER_REPLICATE`(复制边缘像素)等,以处理变换后的额外区域。...

    opencv实现图像动态旋转

    // 或者使用 larger_size,如果希望旋转后图像填充新大小 Size larger_size(img.cols + abs(rot_mat.at(0, 2)), img.rows + abs(rot_mat.at(1, 2))); warpAffine(img, rotated_img, rot_mat, larger_size, INTER_...

    opencv图像旋转

    在OpenCV库中,图像旋转是一项常见的操作,用于调整图像的方向或校正因拍摄角度问题导致的倾斜。在这个项目中,我们使用了OpenCV 2.4.9版本,并在Visual Studio 2012环境下编写代码。图像旋转通常涉及到三个关键参数...

    OpenCV实现任意角度彩色图像旋转

    缩放因子用于控制旋转后图像的大小,保持为1则不会改变原始尺寸。 接下来,我们使用`warpAffine()`函数应用旋转矩阵到原始图像上。这个函数接受源图像、目标图像、旋转矩阵以及目标图像的大小作为输入。为了保持...

    OpenCV 图像旋转

    在本篇文章中,我们将深入探讨如何使用OpenCV来实现图像的旋转,这对于图像分析、增强或者调整图像方向至关重要。 首先,我们要理解图像旋转的基本原理。在二维空间中,图像旋转可以通过矩阵运算实现。OpenCV使用...

    OpenCvSharp的图像基本处理功能:平移、旋转、镜像、映射

    在本文中,我们将深入探讨如何利用OpenCvSharp来实现这些功能,并展示如何在Windows Forms应用程序中的pictureBox控件上显示处理后的图像,以及如何将结果保存至本地磁盘。 首先,我们需要引入OpenCvSharp库,确保...

    QT+opencv图像几何变换,包括图像平移,图像旋转,图像缩放

    OpenCV的`getRotationMatrix2D`函数可以生成这个矩阵,输入参数包括旋转中心(通常是图像的中心点)、旋转角度(顺时针为负,逆时针为正)和旋转后的缩放比例(保持原大小则设为1)。 3. **图像缩放**:图像缩放是...

    图像任意角度旋转(opencv实现)

    在OpenCV中,旋转图像主要通过`getRotationMatrix2D`函数和`warpAffine`函数实现。`getRotationMatrix2D`用于计算旋转矩阵,输入参数包括旋转中心(通常是图像的中心点),旋转角度(顺时针为负,逆时针为正),以及...

    Python+OpenCV 实现图片无损旋转90°且无黑边

    传统的图片旋转是通过简单地改变图片的像素来实现的,但由于旋转后图片的尺寸变化,通常会使得原始图片的边缘部分超出新图像的边界,形成黑边。为了解决这个问题,我们需要在旋转图片后,找到新图像中非黑边的部分,...

    OpenCvSharp图片旋转.zip

    总之,OpenCvSharp为C#开发者提供了强大且直观的接口,使得图像旋转和翻转变得简单易行。无论是在开发图像处理软件、分析视频流,还是进行计算机视觉研究,OpenCvSharp都是一个不可或缺的工具。通过熟练掌握这些基本...

    Opencv图像旋转缩放源码test.rar

    在实际应用中,可能还需要考虑边缘处理,例如旋转后图像可能会超出原边界,此时需要设置填充颜色或使用边界模式来处理。 QT与OpenCV结合,可以在QT的窗口中显示和处理OpenCV的图像。例如,你可以创建一个`QImage`...

    基于Opencv实现的图像纠偏

    在OpenCV中,可以使用`cv2.threshold()`函数来实现这一操作,通过设定阈值,将像素值高于阈值的部分设为白色,低于阈值的部分设为黑色。 接下来是黑边裁剪,这是为了去除图像四周可能存在的非图像区域,如扫描文档...

    opencv图像 旋转 坐标

    总结来说,OpenCV提供了方便的工具进行图像旋转,通过`getRotationMatrix2D`生成旋转矩阵,然后利用`warpAffine`实现旋转。在图像尺寸变化时,需要计算新的尺寸,并可能涉及到坐标转换。了解这些知识对于进行图像...

    关于旋转图片会丢失四角的解决办法

    在图像处理领域,尤其是使用Halcon这种专业机器视觉软件时,可能会遇到图片旋转后四角丢失的问题。这通常是由于图片旋转操作导致的像素裁剪。本文将深入探讨这个问题,并提供有效的解决方案。 首先,理解问题的根源...

    基于OpenCV的的图像旋转匹配算法模板(C++实现)

    基于OpenCv实现了模板图像的旋转匹配,此代码基于matchTemplate函数封装实现可以得知旋转角度的模板匹配(vs2013+opencv2.4.9) 2.带旋转的模板匹配的原理及算法实现(c++) 带旋转的模板匹配算法,能够匹配带旋转...

    opencv实现图像旋转任意角度(边界正好填充),并可以实现反转回原图像大小。并做了直方图,还要有信噪比比较效果。

    为了使旋转后图像的边界正好填充,我们可以调整旋转矩阵,使其包含原图像的所有像素,然后使用`copyMakeBorder`函数添加边框。 代码示例: ```cpp cv::Rect bbox = cv::getRotatedRect(image.size(), rotation_...

    opencv实现图像任意角度旋转的代码实现(内含算法解析)

    这个函数接受三个参数:旋转中心的坐标(cx, cy),旋转角度θ,以及一个缩放因子,用于控制旋转后图像的大小。缩放因子为1则保持原图大小,大于1则放大,小于1则缩小。 ```python import cv2 import numpy as np ...

Global site tag (gtag.js) - Google Analytics