• 放射变换参数求解


          仿射变换(Affine Transformation或 Affine Map)是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。放射变换可以写为如下的形式:

    x,y 属于仿射过后的图坐标;x',y'原图坐标

    不共线的三点唯一决定一个放射变换!

    #include <highgui.h>
    #include <cv.h>
    
    int main(int argc, char** argv)
    {
        CvPoint2D32f srcTri[3], dstTri[3]; //二维坐标下的点,类型为浮点
        CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );  //多通道矩阵
        CvMat* warp_mat = cvCreateMat( 2, 3, CV_32FC1 );
        IplImage *src, *dst;
    
        if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )
        {
            dst = cvCloneImage( src );  //制作图像的完整拷贝
            dst ->origin = src ->origin;  
            /*
            int origin; /* 0 - 顶—左结构,
            1 - 底—左结构 (Windows bitmaps 风格) 
            */
            cvZero( dst );  //清空数组
    
            //计算矩阵仿射变换
            srcTri[0].x = 0;
            srcTri[0].y = 0;
            srcTri[1].x = src -> width - 1;  //缩小一个像素
            srcTri[1].y = 0;
            srcTri[2].x = 0;
            srcTri[2].y = src -> height - 1;
    
            //改变目标图像大小
            dstTri[0].x = src -> width * 0.0;
            dstTri[0].y = src -> height * 0.33;
            dstTri[1].x = src -> width * 0.85;
            dstTri[1].y = src -> height * 0.25;
            dstTri[2].x = src -> width * 0.15;
            dstTri[2].y = src -> height * 0.7;
            cvGetAffineTransform( srcTri, dstTri, warp_mat );  //由三对点计算仿射变换 
            cvWarpAffine( src, dst, warp_mat );  //对图像做仿射变换
            cvCopy( dst, src );  //将dst拷贝给src
    
            //计算旋转仿射变换
            CvPoint2D32f center = cvPoint2D32f( src -> width / 2, src -> height / 2 );
            double angle = -50.0; //旋转角度,负值表示顺时针
            double scale = 0.6;  //各项同性的尺度因子 
            cv2DRotationMatrix( center, angle, scale, rot_mat );
            cvWarpAffine( src, dst, rot_mat );  //将src仿射变换存入dst
    
            //输出
            cvNamedWindow( "Affine_Transform", 1 );
            cvShowImage( "Affine_Transform", dst );  //最终是输出dst 
            cvWaitKey();
        }
        cvReleaseImage( &dst );
        cvReleaseMat( &rot_mat );
        cvReleaseMat( &warp_mat );
    
        return 0;
    }

     参考:http://blog.csdn.net/hitwengqi/article/details/6888783

             http://blog.csdn.net/augusdi/article/details/14150747

  • 相关阅读:
    php关于网页乱码问题
    EditPlus编写PHP使用技巧
    Dedecms当前位置(面包屑导航)的处理
    css有关鼠标移动上去图片变透明度变化
    CSS之Position详解
    如何修改FlashFXP默认编辑工具使用记事本打开
    ecshop点击订购、加入按钮没反应的解决方法
    kindEditor完整认识 PHP上调用并上传图片说明
    OpenCV 实现分水岭算法
    OpenCV 矩形轮廓检测
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/6040498.html
Copyright © 2020-2023  润新知