使用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 heapq使用详解及实例代码
Jan 25 Python
Python 多线程的实例详解
Sep 07 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
用python实现k近邻算法的示例代码
Sep 06 Python
浅谈Python的list中的选取范围
Nov 12 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
Pytorch之卷积层的使用详解
Dec 31 Python
python实现贪吃蛇游戏源码
Mar 21 Python
python 连续不等式语法糖实例
Apr 15 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
Django使用echarts进行可视化展示的实践
Jun 10 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python求解水仙花数的方法
2015/05/11 Python
python生成IP段的方法
2015/07/07 Python
python使用Matplotlib画饼图
2018/09/25 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
管理科学大学生求职信
2013/11/13 职场文书
买房协议书范本
2014/10/23 职场文书
三八妇女节致辞
2015/07/31 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
关于Redis的主从复制及哨兵问题
2022/06/16 Redis