OpenCV_图像旋转超详细讲解

图像转置

transpose(src, dst);

transpose()可以实现像素下标的x和y轴坐标进行对调:dst(i,j)=src(j,i),接口形式

cpp 复制代码
transpose(
  InputArray src, // 输入图像
  OutputArray dst, // 输出
)

图像翻转

flip(src, dst, 1);

flip()函数可以实现对图像的水平翻转、垂直翻转和双向翻转

cpp 复制代码
void flip(
     InputArray src, // 输入图像
     OutputArray dst, // 输出
     int flipCode = 0 // >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
  );
 
flip(img1,0)#水平轴翻转(上下翻转)
flip(img1,1)#垂直轴翻转(左右翻转)
flip(img1,-1)#双向翻转

1.flip(img1,0)#水平轴翻转(上下翻转)

2.flip(img1,1)#水平轴翻转(左右翻转)

3.flip(img1,-1)#双向翻转

代码显示:

cpp 复制代码
void QuickDemo::Flip_Demo(Mat& image) {
	Mat dst;
	transpose(image, dst);
	//flip(image,dst,0);//上下翻转
	//flip(image,dst, 1);//左右翻转
	//flip(image, dst, -1);//对角翻转
	imshow("图像转置", dst);
}

图像旋转

warpAffine()仿射变换函数

warpAffine() 是 OpenCV 库中的一个函数,用于进行二维仿射变换。该函数将输入图像映射到输出图像,应用仿射变换。

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

参数详解:

src:输入图像,必须是单通道或三通道的8位或32位浮点型图像。
dst:输出图像,其大小和类型与输入图像相同。
mat:2x3的变换矩阵。
dsize:输出图像的大小,如果这个参数为 Size() ,则输出图像的大小将与输入图像相同。
flags:用于指定插值的方法,默认为线性插值。可用的选项有 INTER_NEAREST, INTER_LINEAR, INTER_CUBIC 等。
borderMode:用于指定如何处理输出图像边缘的像素,默认为常量填充模式。可用的选项有 BORDER_CONSTANT, BORDER_REPLICATE, BORDER_WRAP 等。
borderValue:用于指定填充的边界值,默认为0。

这个函数使用仿射变换来将输入图像映射到输出图像。仿射变换包括旋转、缩放、平移等操作,但不包括扭曲和剪切。这个函数非常有用,特别是在需要将图像映射到另一个大小或以特定方式旋转或倾斜图像时。

我这里写的是绕着图像的中心旋转

cpp 复制代码
void QuickDemo::Rotate_Demo(Mat& image) {
	Mat dst, M;
	int w = image.cols;
	int h = image.rows;
	M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);
	warpAffine(image, dst, M, Size(w, h), INTER_LINEAR, 0, Scalar(255, 0, 0));
	namedWindow("旋转演示", WINDOW_AUTOSIZE);
	imshow("旋转演示", dst);
}

注意:演示过程中,图片存在四个边缘丢失的情况,需要进行改进

cpp 复制代码
double cos = abs(M.at<double>(0, 0));
double sin = abs(M.at<double>(0, 1));

这段代码的目的是从变换矩阵中提取余弦值正弦值。这里的变换矩阵通常用于图像处理中的旋转操作,特别是在使用OpenCV库时。具体来说,这段代码做了以下几件事情:

  1. 提取变换矩阵的元素 ‌:通过M.at<double>(0, 0)M.at<double>(0, 1),分别提取了变换矩阵的第一行第二列和第一行第三列的元素。这些元素在旋转矩阵中通常代表旋转角度的正弦和余弦值。

  2. 取绝对值 ‌:使用abs()函数对提取的元素取绝对值。这是因为旋转矩阵中的正弦和余弦值可能是正数也可能是负数,取决于旋转的方向。取绝对值可以确保无论旋转方向如何,这些值都能正确表示旋转的角度。

  3. 应用场景‌:这段代码通常出现在图像处理中,特别是在需要计算图像旋转时。通过这个变换矩阵,可以进一步计算图像旋转后的位置和大小。

根据上图重新为新图设置宽 ,高,代码如下:

cpp 复制代码
void QuickDemo::Rotate_Demo(Mat& image) {
	Mat dst, M;
	int w = image.cols;
	int h = image.rows;
    // 获取旋转矩阵        旋转中心   角度   缩放比例 1 
	M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);
	double cos = abs(M.at<double>(0, 0));
	double sin = abs(M.at<double>(0, 1));
	int nw = cos * w + sin * h;
	int nh = sin * w + cos * h;
	M.at<double>(0, 2) += (nw / 2 - w / 2);
	M.at<double>(1, 2) += (nh / 2 - h / 2);
	//warpAffine(image, dst, M, Size(w, h), INTER_LINEAR, 0, Scalar(255, 0, 0));
	warpAffine(image, dst, M, Size(nw, nh));
	namedWindow("旋转演示", WINDOW_AUTOSIZE);
	imshow("旋转演示", dst);
}

相关推荐
rengang661 分钟前
13-卷积神经网络(CNN):探讨CNN在图像处理中的应用和优势
图像处理·人工智能·深度学习·神经网络·cnn
DO_Community5 分钟前
裸金属 vs. 虚拟化 GPU 服务器:AI 训练与推理应该怎么选
运维·服务器·人工智能·llm·大语言模型
CoovallyAIHub5 分钟前
未来已来:从 CVPR & ICCV 观察 2025→2026 年计算机视觉的七大走向
深度学习·算法·计算机视觉
科技峰行者8 分钟前
华为发布Atlas 900 DeepGreen AI服务器:单机柜100PF算力重构AI训练基础设施
服务器·人工智能·华为·aigc·gpu算力
weixin_3077791319 分钟前
应对不规则负载的异步ML模型服务AWS架构设计
人工智能·深度学习·机器学习·云计算·aws
Xander W30 分钟前
基于K8s集群的PyTorch DDP 框架分布式训练测试(开发机版)
人工智能·pytorch·分布式·python·深度学习·kubernetes
Wah-Aug34 分钟前
基于 PyTorch 的 UNet 与 NestedUNet 图像分割
人工智能·pytorch·计算机视觉
云和数据.ChenGuang35 分钟前
感知机之争,杀死神经网络的“人工智能之父”
人工智能·深度学习·神经网络
rengang6637 分钟前
10-神经网络的工作原理:分析神经网络如何学习和推理
人工智能·深度学习·神经网络·学习
无风听海39 分钟前
神经网络之向量降维
人工智能·神经网络·机器学习