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

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

  1. 旋转图像所要围绕的中心
  2. 旋转的角度. 在OpenCV中正角度是逆时针的
  3. 可选择: 缩放因子

具体实现有两个步骤:

1、getRotationMatrix2D 获取旋转矩阵

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=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()
{
    Mat     image(240, 320, CV_8U, Scalar(0));
    Point   center(130, 55);
    double  angle = 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实现对图像的任意角度旋转_第1张图片

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

 

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

你可能感兴趣的:(opencv)