使用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协程的用法和例子详解
Sep 09 Python
python数据封装json格式数据
Mar 04 Python
TensorFlow数据输入的方法示例
Jun 19 Python
Django model序列化为json的方法示例
Oct 16 Python
Python装饰器简单用法实例小结
Dec 03 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
python字符串拼接+和join的区别详解
Dec 03 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
详解Python中的进程和线程
Jun 23 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中set_include_path()函数相关用法分析
2016/07/18 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python实现统计单词出现的个数
2015/05/28 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python后端接收前端回传的文件方法
2019/01/02 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python类的继承用法示例
2019/01/31 Python
python语言元素知识点详解
2019/05/15 Python
对Python函数设计规范详解
2019/07/19 Python
opencv 阈值分割的具体使用
2020/07/08 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
班组长岗位职责范本
2014/01/05 职场文书
股东合作协议书
2014/04/14 职场文书
绿色环保标语
2014/06/12 职场文书
三八活动策划方案
2014/08/17 职场文书
个人授权委托书
2014/09/15 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS