使用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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
python模拟Django框架实例
May 17 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python3实现转换Image图片格式
Jun 21 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
python3下pygame如何实现显示中文
Jan 11 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
Python数据分析入门之教你怎么搭建环境
May 13 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 采集程序 常用函数
2008/12/18 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
js中function()使用方法
2013/12/24 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
vue props 单项数据流实例分享
2020/02/16 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python登录豆瓣并发帖的方法
2015/07/08 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
python 实现aes256加密
2020/11/27 Python
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
西式婚礼主持词
2014/03/13 职场文书
毕业自我鉴定书
2014/03/24 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
客房服务员岗位职责
2015/02/09 职场文书