功能函数
1
2
3
4
5
6
|
// 图像旋转 void Rotate( const cv::Mat &srcImage, cv::Mat &dstImage, double angle, cv::Point2f center, double scale) { cv::Mat M = cv::getRotationMatrix2D(center, angle, scale); //计算旋转的仿射变换矩阵 cv::warpAffine(srcImage, dstImage, M, cv::Size(srcImage.cols, srcImage.rows)); //仿射变换 } |
getRotationMatrix2D函数原型
getRotationMatrix2D用来获得旋转的仿射变换矩阵。
1
|
Mat getRotationMatrix2D(Point2f center, double angle, double scale); |
getRotationMatrix2D参数说明
- Point2f类型的center,旋转中心。
- double类型的angle,逆时针旋转的角度。
- double类型的scale,图像旋转后的尺寸比例。
warpAffine函数原型
warpAffine用来仿射变换。
1
2
3
4
5
|
void warpAffine( InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar()); |
warpAffine参数说明
- InputArray类型的src,输入图像。
- OutputArray类型的dst,输出图像。
- InputArray类型的M,仿射变换矩阵。
- Size类型的dsize,输出图像的大小。
- int类型的flags,插值方法。
- int类型的borderMode,边界填充方法。
- const Scalar&类型的borderValue,边界填充数值。
C++测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <iostream> #include <opencv.hpp> using namespace std; using namespace cv; // 图像旋转 void Rotate( const cv::Mat &srcImage, cv::Mat &dstImage, double angle, cv::Point2f center, double scale) { cv::Mat M = cv::getRotationMatrix2D(center, angle, scale); //计算旋转的仿射变换矩阵 cv::warpAffine(srcImage, dstImage, M, cv::Size(srcImage.cols, srcImage.rows)); //仿射变换 } int main() { // 载入图像 cv::Mat src = imread( "0.jpg" ); cv::Mat dst; // 定义参数 int row = src.rows; int col = src.cols; double angle = 30; cv::Point2f center(col / 2, row / 2); double scale = 0.5; // 图像旋转 Rotate(src, dst, angle, center, scale); // 显示图像 imshow( "src" , src); imshow( "result" , dst); waitKey(0); system ( "pause" ); return 0; } |
测试效果
图原图
图2 旋转30°
图3原图大小旋转45
不难看出,旋转后原图的尺寸已经无法满足图像要求了,此时可以缩小比例,也可以扩展整图尺寸使其完全覆盖。
到此这篇关于OpenCV图像旋转Rotate的文章就介绍到这了,更多相关OpenCV图像旋转内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
原文链接:https://blog.csdn.net/zhaitianbao/article/details/124516085