当前位置:   article > 正文

【OpenCV4】(c++)图像旋转平移操作,仿射变换 cv::warpAffine() 详解

cv::warpaffine

函数原型:


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析:

  • src:输入图像
  • dst:输出图像
  • M:旋转矩阵
  • dsize:输出图像的尺寸
  • flags:插值方法,默认为线性插值(这里可以添加 WARP_INVERSE_MAP 使得转换变为从 dst 转到 src)
  • borderMode:像素外推法(默认为 BORDER_CONSTANT)
  • borderValue :当时像素外推法设定为 BORDER_CONSTANT 时候,此处可以设定具体的 border 值,默认为 0

测试代码:

  • 输入图像:
cv::Mat src = cv::imread("lena.jpg", 0);
cv::Mat dst;
  • 1
  • 2

在这里插入图片描述

  • 平移:
    cv::Mat warp_matrix = (cv::Mat_<float>(2, 3) <<
        cos(0), -sin(0), 200,
        sin(0), cos(0), 0);

    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR);

    cv::imshow("Shift along X-axis", dst);
    cv::waitKey(0);

    warp_matrix = (cv::Mat_<float>(2, 3) <<
        cos(0), -sin(0), 0,
        sin(0), cos(0), 200);

    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR );

    cv::imshow("Shift along Y-axis", dst);
    cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述
在这里插入图片描述

  • 旋转:
    double alpha_45 = PI / 4; // 顺时针旋转 45°
    double alpha_90 = PI / 2; // 顺时针旋转 90°

    warp_matrix = (cv::Mat_<float>(2, 3) <<
        cos(alpha_45), -sin(alpha_45), 0,
        sin(alpha_45), cos(alpha_45), 0);

    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR);

    cv::imshow("Clockwise-45", dst);
    cv::waitKey(0);

    warp_matrix = (cv::Mat_<float>(2, 3) <<
        cos(alpha_90), -sin(alpha_90), 0,
        sin(alpha_90), cos(alpha_90), 0);

    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR);

    cv::imshow("Clockwise-90", dst);
    cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述
这里可以看到是围绕左上角的点进行的旋转
在这里插入图片描述
所以旋转 90° 的时候,就看不到图像了

  • 平移 + 旋转:
    warp_matrix = (cv::Mat_<float>(2, 3) <<
        cos(alpha_90), -sin(alpha_90), 200,
        sin(alpha_90), cos(alpha_90), 0);

    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR);

    cv::imshow("Clockwise-90 and shift", dst);
    cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
这里先顺时针旋转了 90°,然后再向 X 轴的正向平移 200 个像素

  • 指定旋转中心点和角度:
    cv::Point2f center(src.rows / 2., src.cols / 2.);
    double angle = 45.0; // 这里正数代表逆时针旋转
    warp_matrix = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::warpAffine(src, dst, warp_matrix, cv::Size(src.cols, src.rows), cv::INTER_LINEAR);

    cv::imshow("Counter-clockwise-45 around center", dst);
    cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/100338
推荐阅读
相关标签
  

闽ICP备14008679号