使用OpenCV实现仿射变换—旋转功能


Posted in Python onAugust 29, 2019

在前面实现了平移和缩放,还有一种常用的坐标变换,那就是旋转。比如拍摄的照片上传到电脑里,再打开时发现人的头在下面脚在上,这样肯定看不了,那么就需要把这个照片旋转180度才可以接受。由于旋转变换,都是绕着点进行运动的,首先要找到轴的位置,默认是原点(0,0),如果要指定点进行,那么要采用前面的平移操作,即是把图片移到这一点上,然后进行旋转,再把它平移回来,这样才可以完成。所以在这个操作过程里,就要多个矩阵进行操作了,先要进行平移矩阵相乘,再与旋转矩阵相乘,最后与反向平移矩阵相乘。旋转的操作都是使用角度方式来计算,因此要使用中学的知识—三角函数sin和cos等,如果对这些知识忘记了,可以回去复习一下中学知识,到这里就会发现数学的知识是非常有用的,特别是中学的知识。一般会解出方案如下:

使用OpenCV实现仿射变换—旋转功能

再加上齐次化,齐次化的目标主要为了把平移操作统一到一个公式里,就可以把公式写成这样:

使用OpenCV实现仿射变换—旋转功能

这个矩阵变换就是纯旋转的公式。一般情况下,会有平移和缩放一起操作,这样单独地去构造这些矩阵就有些麻烦了,为了简单起见,OpenCV提供了一个函数cv2.getRotationMatrix2D来完成这些操作,这个函数调用参数如下:

retval = cv.getRotationMatrix2D( center, angle, scale )

center是元组表示的旋转中心点。

angle是用度表示的旋转角度。

scale是缩放系数。

其实这个函数是计算这样的矩阵:

使用OpenCV实现仿射变换—旋转功能

所以在OpenCV里基本不需要自己去单独计算缩放和旋转的矩阵,调用此函数最简单了。下面通过例子来演示旋转的功能:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
 
#图片的路径
imgname = "img1.jpg"
 
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
 
#图片的高度和宽度
h,w = image.shape[:2]
 
#构造缩放并旋转的2X3的矩阵,然后调用warpAffine执行
A1 = cv2.getRotationMatrix2D((w/2.0, h/2.0), 30, 0.5)
d1 = cv2.warpAffine(image, A1, (w, h), borderValue = 125)
 
#显示操作之后的图片
cv2.imshow("d1",d1)
 
#显示图像
cv2.imshow("image", image)
 
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

使用OpenCV实现仿射变换—旋转功能

左边是旋转并缩放的图片,右边是原图。

上面的例子主要调用函数getRotationMatrix2D来构造矩阵,然后调用函数warpAffine来执行仿射变换操作。

总结

以上所述是小编给大家介绍的使用OpenCV实现仿射变换—旋转功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python单体模式的几种常见实现方法详解
Jul 28 Python
Python实现进程同步和通信的方法
Jan 02 Python
python读取Excel实例详解
Aug 17 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
python导入坐标点的具体操作
May 10 Python
python内存动态分配过程详解
Jul 15 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
python+rsync精确同步指定格式文件
Aug 29 #Python
django-rest-swagger对API接口注释的方法
Aug 29 #Python
Python3视频转字符动画的实例代码
Aug 29 #Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 #Python
python中property属性的介绍及其应用详解
Aug 29 #Python
django-rest-swagger的优化使用方法
Aug 29 #Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 #Python
You might like
PHP模板引擎SMARTY
2006/10/09 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
keep-alive不能缓存多层级路由菜单问题解决
2020/03/10 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
Python中的字典遍历备忘
2015/01/17 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
python之生成多层json结构的实现
2020/02/27 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
急诊科护士自我鉴定
2013/10/14 职场文书
软件工程专业推荐信
2013/10/28 职场文书
校园门卫岗位职责
2013/12/09 职场文书
采购求职信
2014/03/17 职场文书
联谊会主持词
2014/03/26 职场文书
文明班级建设方案
2014/05/15 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技