使用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中实现对list做减法操作介绍
Jan 09 Python
Python实现基于权重的随机数2种方法
Apr 28 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
python基于SMTP协议发送邮件
May 31 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
django连接oracle时setting 配置方法
Aug 29 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
python中字典增加和删除使用方法
Sep 30 Python
scrapy头部修改的方法详解
Dec 06 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的库,结果发现很多东西
2006/12/31 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
php常用的工具开发整理
2019/09/26 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
python logging通过json文件配置的步骤
2020/04/27 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
盛大二次面试题
2016/11/18 面试题
傲盾软件面试题
2015/08/17 面试题
总经理岗位职责范本
2014/02/02 职场文书
身边的榜样活动方案
2014/08/20 职场文书
基层党员对照检查材料
2014/08/25 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server