在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 相关文章推荐
python进阶教程之动态类型详解
Aug 30 Python
Python列表append和+的区别浅析
Feb 02 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python机器学习之SVM支持向量机
Dec 27 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
Python中断多重循环的思路总结
Oct 04 Python
Python单元测试与测试用例简析
Nov 09 Python
Python3 解决读取中文文件txt编码的问题
Dec 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
Python之reload流程实例代码解析
2018/01/29 Python
Python使用wxPython实现计算器
2018/01/30 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Django CBV类的用法详解
2019/07/26 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Python 中如何写注释
2020/08/28 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
《鱼游到了纸上》教学反思
2014/02/20 职场文书
会计员岗位职责
2014/03/15 职场文书
建设投标担保书
2014/05/13 职场文书
会议通知
2015/04/15 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
《火烧云》教学反思
2016/02/23 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
教你用python实现12306余票查询
2021/06/30 Python