【OpenCV4】(c++)图像旋转平移操作,仿射变换 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() 
						)		

解析:

  • 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;

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

  • 平移:
    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);

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

  • 旋转:
    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);

【OpenCV4】(c++)图像旋转平移操作,仿射变换 cv::warpAffine() 详解_第4张图片
这里可以看到是围绕左上角的点进行的旋转
【OpenCV4】(c++)图像旋转平移操作,仿射变换 cv::warpAffine() 详解_第5张图片
所以旋转 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);

【OpenCV4】(c++)图像旋转平移操作,仿射变换 cv::warpAffine() 详解_第6张图片
这里先顺时针旋转了 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);

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

你可能感兴趣的:(计算机视觉,c++,计算机视觉,opencv)