使用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 09 Python
Python中的下划线详解
Jun 24 Python
python正则表达式面试题解答
Apr 28 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
python logging模块的使用总结
Jul 09 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
Python高级特性 切片 迭代解析
Aug 23 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 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
Yii2中DropDownList简单用法示例
2016/07/18 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
js实现简单模态框实例
2018/11/16 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
js实现车辆管理系统
2020/08/26 Javascript
python获取本地计算机名字的方法
2015/04/29 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
用python批量下载apk
2020/12/29 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
简历自我评价怎么写好呢?
2014/01/04 职场文书
大学总结自我鉴定
2014/01/18 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
环保建议书作文
2014/03/12 职场文书
结婚喜宴主持词
2014/03/14 职场文书
新春文艺演出主持词
2014/03/27 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
土地租赁协议书
2015/01/29 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Spring Boot 实现 WebSocket
2022/04/30 Java/Android