使用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的Flask框架中web表单的教程
Apr 20 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
python 为什么说eval要慎用
Mar 26 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
如何通过Django使用本地css/js文件
Jan 20 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 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
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
Python的randrange()方法使用教程
2015/05/15 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
力学专业求职信
2014/07/23 职场文书
创优争先心得体会
2014/09/11 职场文书
具结保证书
2015/01/17 职场文书
收费员岗位职责
2015/02/14 职场文书
2015年宣传工作总结
2015/04/08 职场文书
广播体操比赛主持词
2015/06/29 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript