在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中根据字符串调用函数的实现方法
Jun 12 Python
用python与文件进行交互的方法
Mar 01 Python
python读取文本绘制动态速度曲线
Jun 21 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python如何获取apk的packagename和activity
Jan 10 Python
Python while true实现爬虫定时任务
Jun 08 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 Python
Python中itertools库的四个函数介绍
Apr 06 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
详解javascript脚本何时会被执行
2021/02/05 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
一套PHP的笔试题
2013/05/31 面试题
《最可爱的人》教学反思
2014/02/14 职场文书
便利店促销方案
2014/02/20 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android