在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中定义结构体的方法
Mar 04 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python用tkinter实现一个gui的翻译工具
Oct 26 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 Python
Python中的tkinter库简单案例详解
Jan 22 Python
Golang Web 框架Iris安装部署
Aug 14 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如何把汉字转化为拼音
2015/12/11 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
用js怎么把&字符换成"&amp:"
2006/10/19 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
Python基础之函数用法实例详解
2014/09/10 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
求职面试个人自我评价
2014/02/28 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
仲裁协议书
2014/09/26 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
贷款担保书范本
2015/09/22 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android