在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中操作符重载用法分析
Apr 29 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python获取指定字符前面的所有字符方法
May 02 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
利用nohup来开启python文件的方法
Jan 14 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
python如何实现数据的线性拟合
Jul 19 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
简单了解Python多态与属性运行原理
Jun 15 Python
keras输出预测值和真实值方式
Jun 27 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
建立动态的WML站点(一)
2006/10/09 PHP
php mail to 配置详解
2014/01/16 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
token 机制和实现方式
2020/12/15 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
python3人脸识别的两种方法
2019/04/25 Python
python里运用私有属性和方法总结
2019/07/08 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Django 路由层URLconf的实现
2019/12/30 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
基本款天堂:Everlane
2017/05/13 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
婚礼证婚人证婚词
2014/01/08 职场文书
大型会议接待方案
2014/03/01 职场文书
实习生岗位职责
2014/04/12 职场文书
给老婆的道歉信
2015/01/20 职场文书