理论

http://www.cnblogs.com/wangguchangqing/p/4045150.html

翻开任意一本图像处理的书,都会讲到图像的几何变换,这里面包括:仿射变换(affine transformation)、投影变换(projecttive transformation)。前者针对的是平面上的物体位姿变化,如水平/垂直方向位移、旋转、缩小/放大,常见的应用有ORC字符识别。后者针对的是三维空间中的位置变化,受限于物体依然是平面的,也称为二维投影变换,常见的应用有车牌识别。

图像变换:以上所有变换均可以通过矩阵描述,将输入图像与变换矩阵进行矩阵乘法得到变换后的图像坐标。显然,这种方式非常适合编程实现。

opencv仿射变换函数说明

opencv提供了,从变换矩阵计算,到图像变换,每个流程的一揽子解决方案。

以opencv 3.0为例,参考几何变换模块说明:

1、getAffineTransform

Mat getAffineTransform(InputArray src, InputArray dst)

该函数需要已知变换前与变换后的坐标,返回相应的变换矩阵,至于是何种变换无需事先知道。适用于目标检测场合,通过检测得到的特征点进行图像匹配。

2、getRotationMatrix2D

Mat getRotationMatrix2D(Point2f center, double angle, double scale)

已知旋转中心坐标(坐标原点为图像左上端点)、旋转角度(单位为度°,顺时针为负,逆时针为正)、放缩比例,返回旋转/放缩矩阵。与getAffineTransform相比,无需知道变换后坐标,适用于一般情况下的图像变换。

3、warpAffine

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

根据etAffineTransform或getRotationMatrix2D得到的变换矩阵,计算变换后的图像。

src为输入图像

dst为变换后图像,类型与src一致。

M为变换矩阵,需要通过其它函数获得,当然也可以手动输入。

dsize为输出图像的大小

flags,插值算法,详细如下:


  1. enum InterpolationFlags{
  2. /** nearest neighbor interpolation */
  3. INTER_NEAREST = 0, //最近邻插值
  4. /** bilinear interpolation */
  5. INTER_LINEAR = 1, //双线性插值
  6. /** bicubic interpolation */
  7. INTER_CUBIC = 2, //双三次插值
  8. /** resampling using pixel area relation. It may be a preferred method for image decimation, as
  9. it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST
  10. method. */
  11. INTER_AREA = 3, //区域插值,使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 <span style="font-family: Arial, Helvetica, sans-serif;">INTER_NEAREST</span>方法
  12. /** Lanczos interpolation over 8x8 neighborhood */
  13. INTER_LANCZOS4 = 4, //Lanczos插值(超过8×8像素邻域的Lanczos插值)
  14. /** mask for interpolation codes */
  15. INTER_MAX = 7,
  16. /** flag, fills all of the destination image pixels. If some of them correspond to outliers in the
  17. source image, they are set to zero */
  18. WARP_FILL_OUTLIERS = 8, //填充所有输出图像的象素
  19. /** flag, inverse transformation
  20. For example, polar transforms:
  21. - flag is __not__ set: \f$dst( \phi , \rho ) = src(x,y)\f$
  22. - flag is set: \f$dst(x,y) = src( \phi , \rho )\f$
  23. */
  24. WARP_INVERSE_MAP = 16 //逆变换
  25. };

borderMode,边界处理方式


  1. enum BorderTypes {
  2. BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
  3. BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
  4. BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
  5. BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
  6. BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
  7. BORDER_TRANSPARENT = 5, //!< `uvwxyz|absdefgh|ijklmno`
  8. BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
  9. BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
  10. BORDER_ISOLATED = 16 //!< do not look outside of ROI
  11. };

opencv实现图像旋转(其它仿射变换的流程与此一致)


  1. Mat src;
  2. Mat dst(src.size(),src.type());
  3. ...
  4. cv::Point2f center(x0,y0);
  5. double ang = -30;
  6. cv::Mat rotMat = cv::getRotationMatrix2D(center,ang,1);
  7. cv::warpAffine(src,dst,rotMat,src.size());

顺时针旋转30度

更多请参考:

http://blog.csdn.net/xiaowei_cqu/article/details/7616044

http://blog.csdn.net/godenlove007/article/details/9364971

opencv 图像旋转的更多相关文章

  1. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  2. OpenCV图像旋转

    图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸.图像旋转后图像的水平对称轴.垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换. 如下图: 假 ...

  3. OpenCV 图像旋转实现

    1 旋转矩形 首先建议阅读图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的.其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导. 这里 ...

  4. OpenCL + OpenCV 图像旋转

    ▶ 使用 OpenCV 从文件读取彩色的 png 图像,旋转一定角度以后写回文件 ● 代码,核函数 // rotate.cl //__constant sampler_t sampler = CLK_ ...

  5. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  6. [opencv] 图像几何变换:旋转,缩放,斜切

    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...

  7. 基于c++和opencv底层的图像旋转

    图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...

  8. OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...

  9. 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起

    话说,平凡之处显真格,这一点也没错!  比如,对旋转图像进行双线性插值,很简单吧?  可,对我,折腾了大半天,也没有达到预期效果!  尤其是三个误区让我抓瞎好久: 1,坐标旋转公式.   这东西,要用 ...

随机推荐

  1. Python--方法/技巧在哪用的典型例子

    就我个人在学习Python的过程中,经常会出现学习了新方法后,如果隔上几天不用,就忘了的情况,或者刚学习的更好的方法没有得到应用,还是沿用已有的方法,这样很不利于学习和掌握新姿势,从而拉长学习时间,增 ...

  2. 靠谱的CSS样式

    0. 引言 记录一些用到的CSS样式,只要可以使用CSS3的地方都可以使用. 1. CSS样式 flex布局:引用 阮一峰的网络日志http://www.ruanyifeng.com/blog/201 ...

  3. android.os.Parcel.readByteArray NullPointerException

    报错信息: E/AndroidRuntime( 1626): java.lang.NullPointerException E/AndroidRuntime( 1626): at android.os ...

  4. SparkStreaming 整合kafka Demo

    这里使用的是低级API,因为高级API非常不好用,需要繁琐的配置,也不够自动化,却和低级API的效果一样,所以这里以低级API做演示 你得有zookeeper和kafka 我这里是3台节点主机 架构图 ...

  5. linux用户管理-用户的基本操作

    目录 linux用户管理-用户的基本操作 用户相关的命令 linux用户管理-用户的基本操作 什么是用户 用户指能够正常登录linux或windows系统 区别 本质都是登录系统的,只不过Linux支 ...

  6. 使用odbc从notes中导数据,配置odbc时报错

    上次在配置odbc从notes中导数据时一直报错(忘记是什么错误了),后来,尝试着把notes和notesSQL的路径加入到path中就OK了!

  7. [PHP] 安装PHP报错“Primary script unknown”的解决方法

    当安装完最新版的nginx和最新版的PHP以后,使用niginx默认配置文件中的PHP配置会有错误访问指定目录下的php文件时,显示File not found.错误.查看nginx的错误日志显示 9 ...

  8. postman---postman简单介绍

    有小伙伴们想要了解postman,今天它来了,不要问它到底有多强大,自古免费好用即是王道,它不仅仅是开发接口强大的调试工具,还是测试接口的居家必备,它不仅仅可以把需要调用的接口保存下来方便调用,还可以 ...

  9. 01-day-什么是webpack

    .sass后缀的文件名 比较老了 现在它的后缀名是.scss 其实他们是同一个东西 只是 后缀名发生了变化 以 .sass写的文件的内容是 他没有括号 没有分号 有点怪 它跟新为了.scss 就有了花 ...

  10. c# WF 第7节 对控件的基本操作

    本节内容: 1:修改控件的大小 2:控件的顺序 3:控件的对齐 4:移动button实例 1: 修改控件的大小 第一种: 第二种 : 一次操作多个控件: 选择一个控件.按住ctrl -- 再选择一个控 ...