在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 06 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
基于Python List的赋值方法
Jun 23 Python
tensorflow实现简单逻辑回归
Sep 07 Python
pandas计数 value_counts()的使用
Jun 24 Python
Django ModelForm组件使用方法详解
Jul 23 Python
python同步两个文件夹下的内容
Aug 29 Python
Pandas实现一列数据分隔为两列
May 18 Python
Python xlwt模块使用代码实例
Jun 10 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
python遍历路径破解表单的示例
Nov 21 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/06/10 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
非主流的textarea自增长实现js代码
2011/12/20 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
小程序实现展开/收起的效果示例
2018/09/22 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
python3实现多线程聊天室
2018/12/12 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
前台文员岗位职责及工作流程
2013/11/19 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
C++程序员求职信范文
2014/04/14 职场文书
慰问信格式规范
2015/03/23 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android