简述

仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotations)、平移(Translations)、缩放(Scale operations)等,然而其实现的函数就是cv::warpAffine()

下面我们将对warpAffine()函数进行介绍,并且实现图像的旋转和平移。

warpAffine()--官网介绍

warpAffine

Applies an affine transformation to an image.

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

Python: cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

C: void cvWarpAffine(const CvArr* src, CvArr* dst, const CvMat* mapMatrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) )

Python: cv.WarpAffine(src, dst, mapMatrix, flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, fillval=(0, 0, 0, 0)) → None

C: void cvGetQuadrangleSubPix(const CvArr* src, CvArr* dst, const CvMat* mapMatrix)

Python: cv.GetQuadrangleSubPix(src, dst, mapMatrix) → None

Parameters:
  • src – Source image.
  • dst – Destination image that has the size dsize and the same type as src .
  • M –  transformation matrix.
  • dsize – Size of the destination image.
  • flags – Combination of interpolation methods (see resize() ) and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation (  ).
  • borderMode – Pixel extrapolation method (see borderInterpolate() ). When borderMode=BORDER_TRANSPARENT , it means that the pixels in the destination image corresponding to the “outliers” in the source image are not modified by the function.
  • borderValue – Value used in case of a constant border. By default, it is 0.

The function warpAffine transforms the source image using the specified matrix:

when the flag WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with invertAffineTransform() and then put in the formula above instead of M . The function cannot operate in-place.

由此可看出dst的计算公式:

图像的旋转

主要步骤:

1、根据旋转角度和旋转中心获取旋转矩阵;

2、根据旋转矩阵进行仿射变换,即可实现任意角度和任意中心的旋转效果。

旋转矩阵的形式如下:

其中,

代码:

cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;//旋转角度
double angle = 45;cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows);//指定旋转中心
cv::Point2f center(len / 2., len / 2.);//获取旋转矩阵(2x3矩阵)
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);//根据旋转矩阵进行仿射变换
cv::warpAffine(src, dst, rot_mat, dst_sz);//显示旋转效果
cv::imshow("image", src);
cv::imshow("result", dst);cv::waitKey(0);return 0;

旋转结果显示:

图像的平移

主要步骤:

1、定义好图像的平移矩阵;

2、分别指定x方向和y方向上的平移量tx和ty。

平移矩阵的形式如下:

目标值dst计算公式已经在上面介绍过了。

代码:

cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;cv::Size dst_sz = src.size();//定义平移矩阵
cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);t_mat.at<float>(0, 0) = 1;
t_mat.at<float>(0, 2) = 20; //水平平移量
t_mat.at<float>(1, 1) = 1;
t_mat.at<float>(1, 2) = 10; //竖直平移量//根据平移矩阵进行仿射变换
cv::warpAffine(src, dst, t_mat, dst_sz);//显示平移效果
cv::imshow("image", src);
cv::imshow("result", dst);cv::waitKey(0);return 0;

平移结果显示:

opencv warpAffine()函数详解 -- 图像旋转与平移相关推荐

  1. opencv imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

  2. opencv学习笔记五:cv2.warpAffine()函数详解

    cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转.仿射.平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换.它一般是和cv2.getRotationMatr ...

  3. opencv reshape函数详解

    在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数. 函数原型: C++: Mat Mat::reshape(int cn, in ...

  4. Opencv imshow 函数详解

    官方文档:imshow.namedWindow等 本来想看看imshow的窗口是否可以隐藏菜单栏,看完官方文档感觉是不可以了. imshow imshow的输入参数如下: void cv::imsho ...

  5. 图像处理笔记(2)---- OpenCV imread函数详解

    imread()读取图片文件,imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种: cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1. ...

  6. OpenCV 图像卷积:cv.filter2D() 函数详解

    API 照例,我们搬一下官网的 API: C++ void cv::filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kern ...

  7. OpenCV 图像缩放:cv.resize() 函数详解

    目录 系列前言 API 函数详解 参数列表 缩放方式其一 缩放方式其二 两种方式的优先级 关于插值方式 扩展 -- 相关函数 系列前言 这个系列是我第一个想要更下去的系列.每篇会全面介绍一个 Open ...

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

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

  9. 【OpenCV 4开发详解】图像卷积

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

最新文章

  1. ASP.NET 2.0中GRIDVIEW排序
  2. 转载:Ajax及 GET、POST 区别
  3. ecshop 修改评论功能
  4. 杨氏干涉的模拟的MATLAB仿真
  5. php soap对象数组,nusoap传递数组对象
  6. python日志汇总
  7. php string pos,有关pos()的文章推荐10篇
  8. 左神算法:可见的山峰对数量(有重复值的情况)(Java版)
  9. 我在架构设计和代码开发中的一些常用原则
  10. stol函数在linux下使用,Linux下ATT汇编语法简介一
  11. AES-加密解密工具类
  12. Dart与系统进程交互
  13. Java 绘制艺术图案
  14. php请求图片,PHP - 发送GET请求并获取图片作为回报
  15. error: Unable to find vcvarsall.bat
  16. Oracle 查看表空间的使用情况SQL语句
  17. win8.1修改用户名
  18. html caption属性的值,HTML中的caption属性是什么意思?caption标签在HTML中
  19. 计算机输入输出接口形式,输入输出接口-微计算机原理-电子发烧友网站
  20. 骨传导蓝牙耳机哪款好、好用的骨传导耳机推荐

热门文章

  1. 如何解决电脑C盘不能扩展问题
  2. 新手小白用C# winform 读取Excel表
  3. 在h5页面中调起支付宝小程序中的某一个页面以及URLScheme 之 支付宝
  4. 飞机计算机系统叫什么,飞机电脑和个人电脑有什么不同?
  5. java中static什么意思_Java中static的含义和用法
  6. 生活学习常用软件介绍下载
  7. 2022年最新山东建筑八大员(市政)模拟考试题库及答案
  8. C语言 sigchild回收子进程
  9. 解决open()不能打开带中文的文件路径
  10. 信号的概念,认识,处理动作