在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中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Unicode和Python的中文处理
Mar 19 Python
python编写Logistic逻辑回归
Dec 30 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
基于python操作ES实例详解
Nov 16 Python
Python 解析简单的XML数据
Jul 24 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
Python自然语言处理之切分算法详解
Apr 25 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
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
chrome调试javascript详解
2015/10/21 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
js转换对象为xml
2017/02/17 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
python动态监控日志内容的示例
2014/02/16 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
python 生成器协程运算实例
2017/09/04 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
工作自荐信
2013/12/11 职场文书
改革共识倡议书
2014/08/29 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
学校师德师风整改措施
2014/10/27 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
红歌会主持词
2015/07/02 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android