OpenCV图像的旋转是通过图像的仿射变换来实现的,实现图像的旋转,分为三个步骤:

第一步:确定旋转角度和旋转中心。

第二步:确定旋转矩阵。通过getRotationMatrix2D函数计算出。

第三步:通过仿射变换实现旋转。通过warpAffine函数实现。

一、getRotationMatrix2D函数

原型

CV_EXPORTS_W Mat getRotationMatrix2D(Point2f center, double angle, double scale);

功能:计算一个二维旋转的仿射矩阵。

函数计算下面的矩阵:
[[αβ(1−α)⋅center.x−β⋅center.y−βαβ⋅center.x+(1−α)⋅center.y]][\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}] [[α−β​βα​(1−α)⋅center.x−β⋅center.yβ⋅center.x+(1−α)⋅center.y​]]
此处:
[α=scale⋅cos⁡angle,β=scale⋅sin⁡angle][\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}] [α=scale⋅cosangle,β=scale⋅sinangle​]
变换映射旋转中心是到中心自己本身,如果这个不是目标,调整偏移量。

参数释义

  • 参数 center 源图像中的旋转中心
  • 参数 angle 读书表示的旋转角度.正值表示逆时针旋转 (坐标原点假定在左上角).
  • 参数 scale 两个轴的各向同性比例因子。1表示不缩放。

参考 getAffineTransform, warpAffine, transform

二、warpAffine函数

原型:

CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst,InputArray M, Size dsize,int flags = INTER_LINEAR,int borderMode = BORDER_CONSTANT,const Scalar& borderValue = Scalar());

功能:对一个图像实现一个仿射变换

当设置标志WARP_INVERSE_MAP 的时候,函数warpAffine变换使用以下的矩阵来实现一个仿射变换:
[dst(x,y)=src(M11x+M12y+M13,M21x+M22y+M23)][\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})] [dst(x,y)=src(M11​x+M12​y+M13​,M21​x+M22​y+M23​)]
否则,转换首先使用invertAffineTransform进行倒置,然后在上面的公式中代替M,函数不能就地转换。

参数释义

  • 参数 src 输入图像.
  • 参数 dst 输出图像,大小是dszie,类型和src相同 。
  • 参数 M 2*3的变换矩阵。
  • 参数 dsize 输出图像大小。
  • 参数 flags 插值方法的组合 (参见InterpolationFlags) 和可选的标志 WARP_INVERSE_MAP 意味着M是逆变换.
  • 参数 borderMode 像素外推法 (参见 BorderTypes); 当
    borderMode=#BORDER_TRANSPARENT, 意味着目标图像的像素对应于原图像中的“异常值”,并且不能被函数修改。
  • 参数 borderValue 固定边缘情况下的值,默认是0。

参见warpPerspective, resize, remap, getRectSubPix, transform

三、源码示例

1.旋转

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("D:\\OpenCVtest\\images\\juice.png", 1);if (src.empty()){cout << "could not load image..." << endl;return -1;}double rotate_angle = 15;                              //设置旋转的角度Point2f rotate_center(src.rows / 2, src.cols / 2);     // 设置旋转中心Mat rotate_matrix = getRotationMatrix2D(rotate_center, rotate_angle, 1);     //计算旋转矩阵Size dstSize(src.cols, src.rows);Mat image_dst;warpAffine(src, image_dst, rotate_matrix, dstSize );    // 仿射变换imshow("源图像", src);imshow("仿射变换0", image_dst);waitKey();return 0;
}

运行结果:

2.三点映射

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src = imread("D:\\OpenCVtest\\images\\juice.png", 1);if (src.empty()){cout << "could not load image..." << endl;return -1;}Size dstSize(src.cols, src.rows);//  定义三个点Point2f srcPoints[3];Point2f dstPoints[3];srcPoints[0] = Point2f(0, 0);srcPoints[1] = Point2f(0, (float)(src.cols-1));srcPoints[2] = Point2f(float(src.rows-1), (float)(src.cols - 1));// 变换后的三个点dstPoints[0] = Point2f((float)(src.rows)*0.15, (float)(src.cols)*0.25);dstPoints[1] = Point2f((float)(src.rows) * 0.25, (float)(src.cols) * 0.65);dstPoints[2] = Point2f((float)(src.rows) * 0.70, (float)(src.cols) * 0.70);// 根据对应点求仿射矩阵Mat rotate_matrx_1 = getAffineTransform(srcPoints, dstPoints);Mat image_warp;warpAffine(src, image_warp, rotate_matrx_1, dstSize);imshow("源图像", src);imshow("三点映射仿射变换", image_warp);waitKey();return 0;
}

运行结果:

OpenCV图像仿射变换相关推荐

  1. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移...

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  2. opencv图像仿射变换,cv2.warpAffine

    目录 仿射变换原理介绍 cv2.warpAffine函数介绍 代码实例 仿射变换原理介绍 仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间. 在有 ...

  3. opencv图像仿射变换和普通旋转

    背景:今天需要对程序生成的图像进行旋转90度和下采样操作,当然还有改变图像类型的操作,就是把原来.png的图像转换为.jpg的图像,主要是我目前使用libharu库,无法成功从本地加载png图像到pd ...

  4. 【OpenCV 4开发详解】图像仿射变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

    OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...

  6. OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】

    OpenCV图像几何变换专题(缩放.翻转.仿射变换及透视)(python为工具) [Open_CV系列(五)] 文章目录 准备图片 1. 缩放 cv2.resize()方法 2. 翻转 cv2.fli ...

  7. OpenCV图像缩放插值之BiCubic双三次插值

    图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中 ...

  8. [Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. java 位运算 多个状态_位运算表示对象所处状态
  2. python for i in range 三维_python中的三维卷积
  3. 安装CDH5时出错 5.68.168.192.in-addr.arpa domain name pointer bogon.
  4. Ubuntu8.10安装Netbeans6.7中文乱码解决方案
  5. IEnumerable是否应该实现IEnumerable接口
  6. SAP 错误日志的调查
  7. customizing download - debug in CRM
  8. linux中不同版本的gcc切换,Ubuntu 14.04中升级gcc到版本4.9.2并切换使用它们
  9. 转换图片保持画质_图片格式怎么相互转换,如何转换jpg、 bmp、png格式
  10. java 缓冲流 刷新_java – 缓冲和刷新Apache Beam流数据
  11. linux之sed用法-转
  12. 挑战程序设计竞赛:Conscription
  13. 德标螺纹规格对照表_(外)内六角螺塞标准编号-国家标准JB/德标DIN
  14. Java项目:SSM的校园二手交易平台
  15. pkpm弹性时程分析计算书怎么出_一套软件,带你掌握复杂建筑结构分析方法
  16. ubuntu显示隐藏文件
  17. 项目管理 - 团队成员无法按期完成任务怎么办?
  18. C语言案例教学设计论文,C语言教学设计本科教学论文
  19. 叽歪网创始人李卓桓:叽歪的微信息模式
  20. 为Firefox手动添加搜索引擎

热门文章

  1. boost::mp11::mp_none_of_q相关用法的测试程序
  2. boost::describe模块实现嵌套枚举的测试程序
  3. 基于Boost::beast模块的同步WebSocket客户端
  4. Boost:系统测试的实例
  5. Boost:boost::asio模块的allocation service分配服务测试程序
  6. VTK:可视化之FontFile
  7. VTK:Utilities之CustomDenseArray
  8. VTK:PolyData之FitSplineToCutterOutput
  9. VTK:图片之ImageNoiseSource
  10. VTK:几何对象之Arrow