在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 Tkinter简单布局实例教程
Sep 03 Python
Python查找相似单词的方法
Mar 05 Python
Python编程求质数实例代码
Jan 31 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
Python3实现购物车功能
Apr 18 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
python 绘制正态曲线的示例
Sep 24 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
python实现计算图形面积
Feb 22 Python
python如何实现递归转非递归
Feb 25 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 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 版本]
2007/03/20 PHP
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
详解百度百科目录导航树小插件
2017/01/08 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
详解Python中的正则表达式的用法
2015/04/09 Python
python Celery定时任务的示例
2018/03/13 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
django 单表操作实例详解
2019/07/30 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Python命令行click参数用法解析
2019/12/19 Python
物理教学随笔感言
2014/02/22 职场文书
自荐信的格式
2014/03/10 职场文书
单位工作证明书格式
2014/10/04 职场文书
2014年加油站工作总结
2014/12/04 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
初一语文教学反思
2016/03/03 职场文书