使用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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
python3中编码获取网页的实例方法
Nov 16 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中的正规表达式(二)
2006/10/09 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
javascript操作cookie
2017/01/17 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
python中去空格函数的用法
2014/08/21 Python
Python中的面向对象编程详解(下)
2015/04/13 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python集合是否可变总结
2019/06/20 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
小学数学教学反思
2014/02/02 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
中学生思想品德评语
2014/12/31 职场文书
工作保证书
2015/01/17 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
python对文档中元素删除,替换操作
2022/04/02 Python