在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格式化压缩后的JS文件的方法
Mar 05 Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python程序退出方式小结
Dec 09 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 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 str_pad 函数用法简介
2009/07/11 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
php中实现记住密码自动登录的代码
2011/03/02 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
JS实现页面打印功能
2017/03/16 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python中的生成器和yield详细介绍
2015/01/09 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
详解python读取image
2019/04/03 Python
python实现月食效果实例代码
2019/06/18 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
《再别康桥》教学反思
2014/02/12 职场文书
勤俭节约倡议书
2014/04/14 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
新生儿未入户证明
2015/06/23 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL