仿射(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
无损旋转另外一种做法,还可以把图片处理成正方形,旋转后再剪裁掉填充部分。比如:图像处理: 无损地旋转图像