在Python下利用OpenCV来旋转图像的教程


Posted in Python onApril 16, 2015

OpenCV是应用最被广泛的的开源视觉库。他允许你使用很少的代码来检测图片或视频中的人脸。

这里有一些互联网上的教程来阐述怎么在OpenCV中使用仿射变换(affine transform)旋转图片--他们并没有处理旋转一个图片里的矩形一般会把矩形的边角切掉这一问题,所以产生的图片需要修改。当正确的使用一点代码时,这是一点瑕疵。
 

def rotate_about_center(src, angle, scale=1.):
  w = src.shape[1]
  h = src.shape[0]
  rangle = np.deg2rad(angle) # angle in radians
  # now calculate new image width and height
  nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
  nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
  # ask OpenCV for the rotation matrix
  rot_mat = cv2.getRotationMatrix2D((nw*0.5, nh*0.5), angle, scale)
  # calculate the move from the old center to the new center combined
  # with the rotation
  rot_move = np.dot(rot_mat, np.array([(nw-w)*0.5, (nh-h)*0.5,0]))
  # the move only affects the translation, so update the translation
  # part of the transform
  rot_mat[0,2] += rot_move[0]
  rot_mat[1,2] += rot_move[1]
  return cv2.warpAffine(src, rot_mat, (int(math.ceil(nw)), int(math.ceil(nh))), flags=cv2.INTER_LANCZOS4)

从原始图像的中心到目标图像的中心,在旋转中的仿射变换必须结合 仿射变换的平移。一个在平面中(2D)的仿射变换是一个2x2的矩阵A和一个平移的向量a-它取得原始点p = (x,y)到目标:Ap + a.结合了两次变换Ap + a和Bp+b,先做A然后是B,软后得到了 B(Ap + a)+ b --另一个与矩阵BA和向量Ba + b的仿射变换。

在此情况下,我们正在把旋转功能与平移合并。作为相似变换的平移具有2x2矩阵I与运动矢量m的特征,所以,以Ip + m表示,我们想首先平移到新的中心,饭后旋转它,这样,在应用Ip + m 后我们旋转Rp + r,产生Rp + Rm + r,这解释了为什么我们不得不只增加两个系数。

附言:悲哀地说,如果numpy把输入的数据看作是矢量的矢量,而不是矩阵,那解释了乘法算子不是矩阵乘法,所以,我们必须明确地写入np.dot。

又附言:我们使用兰索斯插值,这一般对扩展有利而对把规模缩得非常小不利;考虑到应用方面,我们应该改编这个插值。

再附言:与Python的相互作用因cv2模块而改善很多,但是因为numpy的坐标不同于OpenCV,所以仍不可避免地有一些为完善之处。另外,因某个原因,OpenCV始终把各单元当作度数而不是弧度使用,等等。就numpy而言,图像阵列中的坐标是以[y,x]次序存取的,如首先垂直向下增加,接着水平向右增加一样。就OpenCV而言,大小用(宽度,高度)表示,次序正相反。

Python 相关文章推荐
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
Django框架安装方法图文详解
Nov 04 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
如何基于Python实现word文档重新排版
Sep 29 Python
Python中Selenium模块的使用详解
Oct 09 Python
python 如何执行控制台命令与操作剪切板
May 20 Python
在Python中使用Neo4j数据库的教程
Apr 16 #Python
使用Python的Zato发送AMQP消息的教程
Apr 16 #Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 #Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 #Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 #Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 #Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 #Python
You might like
无数据库的详细域名查询程序PHP版(3)
2006/10/09 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
vue中过滤器filter的讲解
2019/01/21 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
[05:05]第三天的dota2
2013/07/29 DOTA
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
xml有哪些解析技术?区别是什么
2016/04/26 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
中文系学生自荐信范文
2013/11/13 职场文书
教师申诉制度
2014/01/29 职场文书
副厂长岗位职责
2014/02/02 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
解除施工合同协议书
2014/10/17 职场文书
考察邀请函范文
2015/01/31 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书