使用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中使用mechanize模块模拟浏览器功能
May 05 Python
浅谈Python中copy()方法的使用
May 21 Python
python八大排序算法速度实例对比
Dec 06 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
Python堆排序原理与实现方法详解
May 11 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
python爬虫要用到的库总结
Jul 28 Python
Python打包为exe详细教程
May 18 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
phalcon框架使用指南
2016/02/23 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
webpack配置sass模块的加载的方法
2017/07/30 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
js实现动态时钟
2020/03/12 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python进行参数传递的方法
2020/05/12 Python
Django 解决由save方法引发的错误
2020/05/21 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
某公司.Net方向面试题
2014/04/24 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
实习生求职自荐信
2014/02/07 职场文书
担保书怎么写
2014/04/01 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
Linux中sftp常用命令整理
2022/06/28 Servers