在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多线程编程方式分析示例详解
Dec 06 Python
Python代码调试的几种方法总结
Apr 15 Python
Python实现数据库编程方法详解
Jun 09 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
安装docker-compose的两种最简方法
Jul 30 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
Python可视化工具如何实现动态图表
Oct 23 Python
Python更改pip镜像源的方法示例
Dec 01 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
js获取页面description的方法
2015/05/21 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Nest.js 授权验证的方法示例
2021/02/22 Javascript
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
wxPython实现分隔窗口
2019/11/19 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
毕业生自荐信的主要内容
2013/10/29 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
上班看电影检讨书
2014/02/12 职场文书
金融管理应届生求职信
2014/02/20 职场文书
高中军训感言500字
2014/02/24 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
代办社保委托书范文
2014/10/06 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
Redis如何一键部署脚本
2021/04/12 Redis