使用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 相关文章推荐
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python 字典中取值的两种方法小结
Aug 02 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
python中count函数简单的实例讲解
Feb 06 Python
python 实现字符串下标的输出功能
Feb 13 Python
Python多线程正确用法实例解析
May 30 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
一个php作的文本留言本的例子(一)
2006/10/09 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
在Django框架中运行Python应用全攻略
2015/07/17 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python获取本机所有IP地址的方法
2018/12/26 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
房屋租赁协议书
2014/04/10 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
大学同学会活动方案
2014/08/20 职场文书
观后感开头
2015/06/19 职场文书
消费者投诉书范文
2015/07/02 职场文书