在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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
python统计一个文本中重复行数的方法
Nov 19 Python
python实现一次创建多级目录的方法
May 15 Python
Python科学计算之Pandas详解
Jan 15 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
python-opencv颜色提取分割方法
Dec 08 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
python 整数越界问题详解
Jun 27 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
python中opencv实现图片文本倾斜校正
Jun 11 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
php Smarty 字符比较代码
2011/02/27 PHP
PHP的PSR规范中文版
2013/09/28 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
this和执行上下文实现代码
2010/07/01 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
深入解析Python编程中super关键字的用法
2016/06/24 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
python绘图模块之利用turtle画图
2021/02/12 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
打架检讨书800字
2014/01/10 职场文书
自行车广告词大全
2014/03/21 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
详解Python魔法方法之描述符类
2021/05/26 Python
PHP中strval()函数实例用法
2021/06/07 PHP
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL