• 放射变换参数求解


          仿射变换(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

  • 相关阅读:
    Delphi代码获取网卡物理地址三种方法 本文来自Delphi之窗,原文地址:http://www.52delphi.com...
    SQL SERVER 中实现公历到农历的转换
    cxgrid相同列合并显示
    rzCheckList.ItemChecked[Index]就可以判断指定节点地状态.
    为什么PING域名得到IP与实际公网IP不符
    如何让sql server2005和sql server2000共存安装在同一机器上
    如何编译通过 Raize 5.3 中的 RzBorder.pas
    u6升级到u890的过程
    技术部门到底该如何管理才能“和谐”
    在CXGRID中如何让字段能以0.00的格式显示
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/6040498.html
Copyright © 2020-2023  润新知