在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 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
python3实现UDP协议的服务器和客户端
Jun 14 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
python神经网络编程之手写数字识别
May 08 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
php上传大文件设置方法
2016/04/14 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
python3大文件解压和基本操作
2017/12/15 Python
Python读写docx文件的方法
2018/05/08 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
经理秘书岗位职责
2013/11/14 职场文书
大学生求职信
2014/06/17 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
网络营销计划
2015/01/17 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
统招统分证明
2015/06/23 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android