图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的。

1、图像的旋转

图像的旋转具体实现分为两步:先根据旋转角度和旋转中心获取旋转矩阵;然后根据旋转矩阵进行仿射变换,即可实现任意角度和任意中心的旋转效果。旋转矩阵的形式如下:
OpenCV3 图像旋转与平移—cv::warpAffine()详解 - 图1
其中,
OpenCV3 图像旋转与平移—cv::warpAffine()详解 - 图2
具体代码如下:

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

结果如下:
OpenCV3 图像旋转与平移—cv::warpAffine()详解 - 图3

2、图像的平移

图像的平移也分为两步:首先定义好图像的平移矩阵,分别指定x方向和y方向上的平移量tx和ty,平移矩阵的形式如下:
OpenCV3 图像旋转与平移—cv::warpAffine()详解 - 图4
具体代码如下:

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

平移结果如下:
OpenCV3 图像旋转与平移—cv::warpAffine()详解 - 图5