在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实现批量重命名文件的代码
May 25 Python
python实现爬虫下载漫画示例
Feb 16 Python
Python实现的下载8000首儿歌的代码分享
Nov 21 Python
Python连接DB2数据库
Aug 27 Python
django实现用户登陆功能详解
Dec 11 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
PyQt5实现简单数据标注工具
Mar 18 Python
python用requests实现http请求代码实例
Oct 31 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python项目跨域问题解决方案
Jun 22 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 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
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
关于页面优化和伪静态
2009/10/11 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
python实现360皮肤按钮控件示例
2014/02/21 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
Python多继承顺序实例分析
2018/05/26 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
演讲稿开场白
2014/01/13 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android