opencv中图像旋转—getRotationMatrix2D和warpAffine

API介绍

getRotationMatrix2D:生成旋转矩阵

cpp 复制代码
Mat getRotationMatrix2D(Point2f center, double angle, double scale);

center:旋转的中心点坐标。

angle:顺时针旋转的角度。

scale:图像缩放比例。

warpAffine:仿射变换

cpp 复制代码
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());

src:原始图像。

dst:输出图像。

M:变换矩阵,这里是由getRotationMatrix2D生成的旋转矩阵。

dsize:输出图像的大小。

flags:插值方法,通常使用INTER_LINEAR。

borderMode:边界像素模式。

borderValue:边界填充值,用于边界外的像素。

示例1

cpp 复制代码
void QuickDemo::rotato_demo(Mat &image) {
	Mat dst, M;
	int  w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);//旋转矩阵,围绕图像中心旋转45°
	warpAffine(image, dst, M, image.size(),INTER_LINEAR,0,Scalar(0,0,255));
	
	imshow("旋转45度", dst);
	imwrite("C:/Users/Desktop/opencv-0/warpAffine45.png",dst);
}

示例2

cpp 复制代码
void QuickDemo::rotato_demo(Mat &image) {
	Mat dst, M;
	int  w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point2f(w / 2, h / 2), 100, 1.0);//旋转矩阵,围绕图像中心旋转45°
	warpAffine(image, dst, M, image.size(),INTER_LINEAR,0,Scalar(0,0,255));
	
	imshow("旋转100度", dst);
	imwrite("C:/Users/Desktop/opencv-0/warpAffine45.png",dst);
}

怎么计算新图像的宽度高度

计算经过仿射变换或旋转后新图像的宽度和高度,尤其是在旋转图像时保持图像的完整性而不裁剪任何部分,需要一些几何计算。
假设原图像的宽度为W,高度为H,旋转角度为theta,旋转后图像的新宽度W'和新高度H'。
1、将角度转换为弧度 **:**

因为大多数数学函数使用弧度制,

cpp 复制代码
theta_r=pi*theta/180;

2、计算四个角点旋转后的位置:

先确定原图像的四个角点的坐标,然后根据旋转公式计算旋转后每个点的新坐标。旋转公式为:
其中,(x, y)是原始坐标,(x', y')是旋转后的坐标。
3、计算新宽度和高度:

旋转后四个角点的最大和最小x、y坐标值之间的差分别给出了新图像的宽度W'和高度H'。

示例3

cpp 复制代码
void QuickDemo::rotato_demo(Mat &image) {
	Mat dst, M;
	int  w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);//旋转矩阵,围绕图像中心旋转45°
	double sin = abs(M.at<double>(0, 1));
	double cos = abs(M.at<double>(0, 0));
	int nw = cos*w + sin*h;//新宽度
	int nh = sin*w + cos*h;//新高度
	M.at<double>(0, 2) = M.at<double>(0, 2) + (nw / 2 - w / 2);
	M.at<double>(1, 2) = M.at<double>(1, 2) + (nh / 2 - h / 2);

	//warpAffine(image, dst, M, image.size(),INTER_LINEAR,0,Scalar(0,0,255));
	warpAffine(image, dst, M, Size(nw,nh), INTER_LINEAR, 0, Scalar(0, 0, 255));
	imshow("旋转45度", dst);
	imwrite("C:/Users/Desktop/opencv-0/warpAffine2.png",dst);
}

示例4

cpp 复制代码
void QuickDemo::rotato_demo(Mat &image) {
	Mat dst, M;
	int  w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point2f(w / 2, h / 2), 100, 1.0);//旋转矩阵,围绕图像中心旋转100°
	double sin = abs(M.at<double>(0, 1));
	double cos = abs(M.at<double>(0, 0));
	int nw = cos*w + sin*h;//新宽度
	int nh = sin*w + cos*h;//新高度
	M.at<double>(0, 2) = M.at<double>(0, 2) + (nw / 2 - w / 2);
	M.at<double>(1, 2) = M.at<double>(1, 2) + (nh / 2 - h / 2);

	//warpAffine(image, dst, M, image.size(),INTER_LINEAR,0,Scalar(0,0,255));
	warpAffine(image, dst, M, Size(nw,nh), INTER_LINEAR, 0, Scalar(0, 0, 255));
	imshow("旋转100度", dst);
	imwrite("C:/Users/Desktop/opencv-0/warpAffine2.png",dst);
}
相关推荐
好吃番茄17 分钟前
U mamba配置问题;‘KeyError: ‘file_ending‘
人工智能·机器学习
CV-King1 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
禁默1 小时前
2024年计算机视觉与艺术研讨会(CVA 2024)
人工智能·计算机视觉
whaosoft-1432 小时前
大模型~合集3
人工智能
Dream-Y.ocean2 小时前
文心智能体平台AgenBuilder | 搭建智能体:情感顾问叶晴
人工智能·智能体
丶21362 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
春末的南方城市2 小时前
FLUX的ID保持项目也来了! 字节开源PuLID-FLUX-v0.9.0,开启一致性风格写真新纪元!
人工智能·计算机视觉·stable diffusion·aigc·图像生成
zmjia1112 小时前
AI大语言模型进阶应用及模型优化、本地化部署、从0-1搭建、智能体构建技术
人工智能·语言模型·自然语言处理
jndingxin3 小时前
OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍
人工智能·opencv·音视频
AI完全体3 小时前
【AI知识点】偏差-方差权衡(Bias-Variance Tradeoff)
人工智能·深度学习·神经网络·机器学习·过拟合·模型复杂度·偏差-方差