使用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使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python实现抠图给证件照换背景源码
Aug 20 Python
python实现字典嵌套列表取值
Dec 16 Python
python实现四人制扑克牌游戏
Apr 22 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
python 数据库查询返回list或tuple实例
May 15 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
彻底解决Python包下载慢问题
Nov 15 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 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中慎用双等于(==)的详解
2013/06/06 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
js中null与空字符串""的区别讲解
2019/01/17 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python清除字符串里非数字字符的方法
2015/07/02 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
tensorflow 变长序列存储实例
2020/01/20 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python高并发和多线程有什么关系
2020/11/14 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
质量保证书范本
2014/04/29 职场文书
法制宣传月活动方案
2014/05/11 职场文书
学习十八大的心得体会
2014/09/12 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
校园安全学习心得体会
2016/01/18 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang