使用opencv的仿射变换函数warpAffine实现对图像的任意角度旋转

想要旋转一幅图像, 需要两个参数:

  1. 旋转图像所要围绕的中心
  2. 旋转的角度. 在OpenCV中正角度是逆时针的
  3. 可选择: 缩放因子
具体实现有两个步骤:
1、getRotationMatrix2D 获取旋转矩阵
【使用opencv的仿射变换函数warpAffine实现对图像的任意角度旋转】Mat getRotationMatrix2D(Point2f center, double angle, double scale)
第一个参数,Point2f类型的center,表示源图像的旋转中心。
第二个参数,double类型的angle,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)。
第三个参数,double类型的scale,缩放系数。
2、warpAffine 实现坐标系仿射变换
void warpAffine(InputArray src,OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=https://www.it610.com/article/Scalar())
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。
第三个参数,InputArray类型的M,2×3的变换矩阵。
第四个参数,Size类型的dsize,表示输出图像的尺寸。
第五个参数,int类型的flags,插值方法的标识符。此参数有默认值INTER_LINEAR(线性插值),可选的插值方式如下:
  • INTER_NEAREST - 最近邻插值
  • INTER_LINEAR - 线性插值(默认值)
  • INTER_AREA - 区域插值
  • INTER_CUBIC –三次样条插值
  • INTER_LANCZOS4 -Lanczos插值
  • CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
  • CV_WARP_INVERSE_MAP –表示M为输出图像到输入图像的反变换,即 。因此可以直接用来做象素插值。否则, warpAffine函数从M矩阵得到反变换。
三、实例
void rotate_test() { Matimage(240, 320, CV_8U, Scalar(0)); Pointcenter(130, 55); doubleangle = 15; rectangle(image, Rect(80, 60, 100, 50), Scalar(255), CV_FILLED); Mat R = getRotationMatrix2D(center, angle, 1.0); // 逆时针旋转angle Mat imgR; warpAffine(image, imgR, R, Size(320, 240)); imshow("Image", image); imshow("Rotate image", imgR); waitKey(0); }


使用opencv的仿射变换函数warpAffine实现对图像的任意角度旋转
文章图片

使用opencv的仿射变换函数warpAffine实现对图像的任意角度旋转
文章图片


REF:
https://blog.csdn.net/qq_18343569/article/details/47952591
https://blog.csdn.net/billbliss/article/details/43758879
https://blog.csdn.net/cqltbe131421/article/details/60954284

    推荐阅读