一、概述
getRotationMatrix2D函数计算二维旋转的仿射矩阵。
该函数计算以下矩阵:
其中scale是缩放比例、angle是旋转的角度。
使用getRotationMatrix2D,我们可以指定图像将围绕其旋转的中心点作为第一个参数,然后是旋转角度(以度为单位),最后是图像的缩放因子。 这里,angle 是逆时针方向的旋转角度。
二、getRotationMatrix2D函数
1、函数原型
Mat cv::getRotationMatrix2D (Point2f center, double angle, double scale)
Matx23d cv::getRotationMatrix2D_ (Point2f center, double angle, double scale)
2、参数详解
center | 源图像中的旋转中心。 |
angle | 以度为单位的旋转角度。 正值表示逆时针旋转(假设坐标原点为左上角)。 |
scale | 各向同性比例因子。 |
三、OpenCV源码
1、源码路径
include\opencv2\imgproc.hpp
opencv\modules\imgproc\src\imgwarp.cpp
2、源码代码
inline
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
{
return Mat(getRotationMatrix2D_(center, angle, scale), true);
}
cv::Matx23d cv::getRotationMatrix2D_(Point2f center, double angle, double scale)
{
CV_INSTRUMENT_REGION();
angle *= CV_PI/180;
double alpha = std::cos(angle)*scale;
double beta = std::sin(angle)*scale;
Matx23d M(
alpha, beta, (1-alpha)*center.x - beta*center.y,
-beta, alpha, beta*center.x + (1-alpha)*center.y
);
return M;
}
四、效果图像示例
c#+opencvsharp简单参考代码如下。
float angle = float.Parse(this.textBox1.Text);
float scale = float.Parse(this.textBox2.Text);
int x = int.Parse(this.textBox4.Text);
int y = int.Parse(this.textBox3.Text);
Mat res = new Mat();
Mat m = Cv2.GetRotationMatrix2D(new Point2f(x,y), angle, scale);
Cv2.WarpAffine(src, res, m, src.Size());
下图是以点(100, 100)为中心,旋转角度为40度,缩放比例为1(即未缩放)得到的结果图片。