当前位置: 首页 > news >正文

OpenCV_图像旋转超详细讲解

图像转置

transpose(src, dst);

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

transpose(InputArray src, // 输入图像OutputArray dst, // 输出
)

图像翻转

flip(src, dst, 1);

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

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)#双向翻转

代码显示:

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 库中的一个函数,用于进行二维仿射变换。该函数将输入图像映射到输出图像,应用仿射变换。

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。

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

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

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);
}

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

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

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

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);
}

原图片

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 轻量级流密码算法Trivium
  • Vue前端无法接收到后端返回的数据以及全局CSS样式影响(已解决)
  • 更高效的搜索工具,国内免费好用的AI智能搜索引擎工具
  • 信息学奥赛入门级学习计划,供有需要的家长们参考
  • pytorch qwen2-vl自定义数据全量微调
  • weblogic CVE-2018-2894 靶场攻略
  • Java项目实战II基于Java+Spring Boot+MySQL的服装厂服装生产管理系统的设计与实现
  • linux网络编程4
  • 21、Tomato
  • 上半年亏损扩大/百亿资产重组终止,路畅科技如何“脱困”?
  • Cassandra 5.0 Spring Boot 3.3 CRUD
  • 计算机网络:物理层 --- 基本概念、编码与调制
  • MySQL基础篇(黑马程序员2022-01-18)
  • 基于深度学习的能源消耗预测
  • css文本修饰
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Hibernate【inverse和cascade属性】知识要点
  • HTTP那些事
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript设计模式与开发实践系列之策略模式
  • rabbitmq延迟消息示例
  • React-redux的原理以及使用
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • unity如何实现一个固定宽度的orthagraphic相机
  • Xmanager 远程桌面 CentOS 7
  • 成为一名优秀的Developer的书单
  • 番外篇1:在Windows环境下安装JDK
  • 分布式任务队列Celery
  • 开源SQL-on-Hadoop系统一览
  • 看域名解析域名安全对SEO的影响
  • 三栏布局总结
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 首页查询功能的一次实现过程
  • 数据科学 第 3 章 11 字符串处理
  • 由插件封装引出的一丢丢思考
  • 智能网联汽车信息安全
  • No resource identifier found for attribute,RxJava之zip操作符
  • Java总结 - String - 这篇请使劲喷我
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​Linux·i2c驱动架构​
  • ​Python 3 新特性:类型注解
  • # C++之functional库用法整理
  • #NOIP 2014# day.1 T2 联合权值
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (二)springcloud实战之config配置中心
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联