getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换
Mat getRotationMatrix2D( Point2f center, double angle, double scale );
- center:图像旋转的中心位置。
- angle:图像旋转的角度,单位为度,正值为逆时针旋转。
- scale:两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1。
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:仿射变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
- M:2×3的变换矩阵。
- dsize:输出图像的尺寸。
- flags:插值方法标志,可选参数及含义在表3-3和表3-4中给出。
- borderMode:像素边界外推方法的标志。
- borderValue:填充边界使用的数值,默认情况下为0
根据旋转矩阵和平移矩阵以及图像像素值,仿射变换的数学原理
Mat getAffineTransform( const Point2f src[], const Point2f dst[] );
- src[]:原图像中的三个像素坐标。
- dst[]:目标图像中的三个像素坐标。
该函数两个输入量都是存放浮点坐标的数组,在生成数组的时候像素点的输入顺序无关,但是需要保证像素点的对应关系,函数的返回值是一个2×3的变换矩阵。
简单示例
//
// Created by smallflyfly on 2021/6/9.
//
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat im = imread("test.jpg");
resize(im, im, Size(0, 0), 0.5, 0.5);
imshow("im", im);
Mat r1;
double angle = 30.0;
Size size(im.cols, im.rows);
Point2f center(im.rows / 2.0, im.cols / 2.0);
r1 = getRotationMatrix2D(center, angle, 1);
Mat warp;
warpAffine(im, warp, r1, size);
imshow("warp1", warp);
// 根据三个点进行仿射
Point2f srcPoints[3];
Point2f dstPoints[3];
//src image 3 points
srcPoints[0] = Point2f(0, 0);
srcPoints[1] = Point2f(0, im.cols-1);
srcPoints[2] = Point2f(im.rows-1, im.cols-1);
// dst image 3 points
dstPoints[0] = Point2f(im.rows * 0.2, im.cols * 0.2);
dstPoints[1] = Point2f(im.rows * 0.1, im.cols * 0.7);
dstPoints[2] = Point2f(im.rows * 0.9, im.cols * 0.7);
r1 = getAffineTransform(srcPoints, dstPoints);
warpAffine(im, warp, r1, size);
imshow("warp", warp);
waitKey(0);
destroyAllWindows();
return 0;
}