OpenCV-Affine 仿射变换

仿射(affine)变换是透视变换的子集。仿射变换包括:平移、缩放、旋转、斜切。特点是比例保持不变。 好好学习线代,好好学习矩阵!

旋转

1.1.简单有损仿射变换

输出图片尺寸和输入图片尺寸一致,内容进行旋转。矩形图片旋转时,有损失,会被部分剪裁!

1
2
3
4
5
6
    Mat &src = *((Mat *) src_addr);//原始输入数据
    Mat *dst = new Mat(); //输出结果
 
    Point2f center(src.cols / 2, src.rows / 2);
    Mat matrix = getRotationMatrix2D(center, angle, 1);//计算旋转矩阵,angle为度数
    warpAffine(src, *dst, matrix, Size(src.cols,src.rows),INTER_LINEAR, BORDER_CONSTANT, Scalar(255, 255, 255));//仿射变换

1.2.无损旋转

输出图片尺寸和输入图片尺寸不一致

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
   #include "opencv2/opencv.hpp"
   
   int main()
   {
       cv::Mat src = cv::imread("im.png", CV_LOAD_IMAGE_UNCHANGED);
       double angle = -45;
   
       // get rotation matrix for rotating the image around its center in pixel coordinates
       cv::Point2f center((src.cols-1)/2.0, (src.rows-1)/2.0);
       cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
       // determine bounding rectangle, center not relevant
       cv::Rect2f bbox = cv::RotatedRect(cv::Point2f(), src.size(), angle).boundingRect2f();
       // adjust transformation matrix
       rot.at<double>(0,2) += bbox.width/2.0 - src.cols/2.0;
       rot.at<double>(1,2) += bbox.height/2.0 - src.rows/2.0;
   
       cv::Mat dst;
       cv::warpAffine(src, dst, rot, bbox.size());
       cv::imwrite("rotated_im.png", dst);
   
       return 0;
   }

参考自stackoverflow 无损旋转另外一种做法,还可以把图片处理成正方形,旋转后再剪裁掉填充部分。比如:图像处理: 无损地旋转图像

Built with Hugo
主题 StackJimmy 设计