使用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代理抓取并验证使用多线程实现
May 03 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
python对象及面向对象技术详解
Jul 19 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
Python中if elif else及缩进的使用简述
May 31 Python
解决python Markdown模块乱码的问题
Feb 14 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
python Matplotlib数据可视化(1):简单入门
Sep 30 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
新浪新闻小偷
2006/10/09 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
使用javascript插入样式
2016/03/14 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
SVG描边动画
2017/02/23 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python实现身份证号码解析
2015/09/01 Python
Python Flask框架扩展操作示例
2019/05/03 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
给校长的一封建议书
2014/03/12 职场文书
《海底世界》教学反思
2014/04/16 职场文书
保护环境标语
2014/06/09 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
Python初识逻辑与if语句及用法大全
2021/08/07 Python