zoukankan      html  css  js  c++  java
  • 第六章

    透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPerspectiveTransform函数来处理。

    ------------------------------------------------------------------------------------------------

    WarpPerspective

    对图像进行透视变换

    void cvWarpPerspective( const CvArr* src, CvArr* dst,const CvMat* map_matrix,

                           int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,

                           CvScalar fillval=cvScalarAll(0) );

    src

    输入图像.

    dst

    输出图像.

    map_matrix

    3×3 变换矩阵

    flags

    插值方法和以下开关选项的组合:

    ·       CV_WARP_FILL_OUTLIERS- 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.

    ·       CV_WARP_INVERSE_MAP- 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。

    fillval

    用来填充边界外面的值

    函数 cvWarpPerspective 利用下面指定矩阵变换输入图像:

    • 如果没有指定 CV_WARP_INVERSE_MAP , 
    • 否则, 

    要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform 。

    -----------------------------

     

    GetPerspectiveTransform

    由四对点计算透射变换

    CvMat* cvGetPerspectiveTransform( const CvPoint2D32f*src, const CvPoint2D32f* dst,

                                      CvMat*map_matrix );

     

    #define cvWarpPerspectiveQMatrixcvGetPerspectiveTransform

    src

    输入图像的四边形顶点坐标。

    dst

    输出图像的相应的四边形顶点坐标。

    map_matrix

    指向3×3输出矩阵的指针。

    函数cvGetPerspectiveTransform计算满足以下关系的透射变换矩阵:

    这里,dst(i)= (x'i,y'i),src(i)= (xi,yi),i = 0..3.

    ------------------------------------------------------------------------------------------------

    /*code*/

    1. #include <highgui.h>   
    2. #include <cv.h>   
    3.   
    4. int main(int argc, char** argv)  
    5. {  
    6.     CvPoint2D32f srcTri[4], dstTri[4]; //二维坐标下的点,类型为浮点   
    7.     //CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );  //多通道矩阵   
    8.     CvMat* warp_mat = cvCreateMat( 3, 3, CV_32FC1 );  
    9.     IplImage *src, *dst;  
    10.   
    11.     if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )  
    12.     {  
    13.         dst = cvCloneImage( src );  //制作图像的完整拷贝   
    14.         dst ->origin = src ->origin;    
    15.         /* 
    16.         int origin; /* 0 - 顶—左结构, 
    17.         1 - 底—左结构 (Windows bitmaps 风格)  
    18.         */  
    19.         cvZero( dst );  //清空数组   
    20.   
    21.         //计算矩阵仿射变换   
    22.         srcTri[0].x = 0;  
    23.         srcTri[0].y = 0;  
    24.         srcTri[1].x = src -> width - 1;  //缩小一个像素   
    25.         srcTri[1].y = 0;  
    26.         srcTri[2].x = 0;  
    27.         srcTri[2].y = src -> height - 1;  
    28.         srcTri[3].x = src -> width - 1;  //bot right   
    29.         srcTri[3].y = src -> height - 1;  
    30.   
    31.         //改变目标图像大小   
    32.         dstTri[0].x = src -> width * 0.05;  
    33.         dstTri[0].y = src -> height * 0.33;  
    34.         dstTri[1].x = src -> width * 0.9;  
    35.         dstTri[1].y = src -> height * 0.25;  
    36.         dstTri[2].x = src -> width * 0.2;  
    37.         dstTri[2].y = src -> height * 0.7;  
    38.         dstTri[3].x = src -> width * 0.8;  
    39.         dstTri[3].y = src -> height * 0.9;  
    40.   
    41.         cvGetPerspectiveTransform( srcTri, dstTri, warp_mat );  //由三对点计算仿射变换    
    42.         cvWarpPerspective( src, dst, warp_mat );  //对图像做仿射变换   
    43.   
    44.         //输出   
    45.         cvNamedWindow( "Perspective Warp", 1 );  
    46.         cvShowImage( "Perspective Warp", dst );  //最终是输出dst    
    47.         cvWaitKey();  
    48.     }  
    49.     cvReleaseImage( &dst );  
    50.     cvReleaseMat( &warp_mat );  
    51.   
    52.     return 0;  
    53. }  
  • 相关阅读:
    第五章 调优案例分析与实战
    第六章 类文件结构
    推送和即时通迅早写完了,,一直没更新,,期末考了。
    Node.js安装备忘录
    将MyEclipse项目导入到Eclipse中
    40个Java集合类面试题和答案(转载)
    可适配平板、手机的Web开发方式
    一次Web请求过程详解
    常见HTTP状态码
    Web前端视频播放及视频的云存储
  • 原文地址:https://www.cnblogs.com/wqj1212/p/3915873.html
Copyright © 2011-2022 走看看