zoukankan      html  css  js  c++  java
  • [转]【OpenCV】仿射变换函数warpAffine、旋转

    【学习OpenCV】仿射变换函数warpAffine、旋转

    转载地址:http://blog.csdn.net/baidu_23287903/article/details/52311149

    理论

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

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

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

    OpenCV仿射变换函数说明

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

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

    1、getAffineTransform

    [cpp] view plain copy
     
     
    1. Mat getAffineTransform(InputArray src, InputArray dst)  
    该函数需要已知变换前与变换后的坐标,返回相应的变换矩阵,至于是何种变换无需事先知道。适用于目标检测场合,通过检测得到的特征点进行图像匹配。


    2、getRotationMatrix2D

    [cpp] view plain copy
     
     
    1. Mat getRotationMatrix2D(Point2f center, double angle, double scale)  
    已知旋转中心坐标(坐标原点为图像左上端点)、旋转角度(单位为度°,顺时针为负,逆时针为正)、放缩比例,返回旋转/放缩矩阵。与getAffineTransform相比,无需知道变换后坐标,适用于一般情况下的图像变换。

    3、warpAffine

    [cpp] view plain copy
     
     
    1. 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,插值算法,详细如下:

    [cpp] view plain copy
     
     
    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.  
    21.     For example, polar transforms: 
    22.     - flag is __not__ set: f$dst( phi ,  ho ) = src(x,y)f$ 
    23.     - flag is set: f$dst(x,y) = src( phi ,  ho )f$ 
    24.     */  
    25.     WARP_INVERSE_MAP     = 16  //逆变换  
    26. };  
    borderMode,边界处理方式
    [cpp] view plain copy
     
     
    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.   
    9.     BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101  
    10.     BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101  
    11.     BORDER_ISOLATED    = 16 //!< do not look outside of ROI  
    12. };  



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

    [cpp] view plain copy
     
     
    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

  • 相关阅读:
    前端面试分享
    1
    22
    微信同声传译插件的使用
    微信小程序基于第三方插件微信同声传译,以及一些问题解决办法
    阿里云服务器各种活动集锦
    腾讯云多人直播开发第一天,基于IE游览器的ActiveX开发
    vue组件化学习第三天
    vue组件化学习第二天
    vue组件化学习第一天
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6489007.html
Copyright © 2011-2022 走看看