分享

仿射变换

 WXGWJS 2016-12-16
  仿射几何就是把欧几里得几何学中的长度、面积、和角度测量都去掉以后剩下的东西,但是平行的概念和直线上点的比例仍然保留。两个仿射空间的X和Y之间的仿射变换是X和Y之间的双射,把m维的子空间映射为m维的子空间,把平行的子空间映射为平行的子空间,并保持等价的仿射坐标不变。判断一个变换是否是仿射变换也可以使用它所具有的把直线映射到直线且不改变平行线段之间带符号长度比例关系的性质决定。仿射变换(Affine Transformation或 Affine Map)是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),仿射变换是不保角度和距离的。仿射变换包括:平移变换,旋转变换,错切变换,比例变换。不共线的三对对应点决定了一个唯一的仿射变换,在仿射变换下图形的不变性质和不变的量称作仿射性质,是仿射几何中的重要研究内容,仿射变换使用齐次坐标表示如下:

                                                                   

刚体:不会产生形变;刚体变换:在变换中不会改变图形的形状。平移,旋转都是刚体变换;缩放,错切会改变物体的形状,不是刚体变换。

1.平移变换:将一点移动到另一点,变换矩阵为:

                                                                                

2.旋转变换变换:将图形进行旋转,变换矩阵为:

3.缩放变换:

4.错切变换:也叫剪切变换


#include<iostream>  
#include<opencv2/highgui/highgui.hpp>  
#include<opencv2/imgproc/imgproc.hpp>   
using namespace std;  
using namespace cv;  
  
int main()  
{  
    Mat src = imread("d://aaa.jpg");  
    Mat dst_warp,dst_warpRotateScale;  
    Point2f srcPoints[3];//创建二维点数组,用来存放原图中的三个点  
    Point2f dstPoints[3];//创建二维点数组,用来存放目标图中的三个点  
  
    //分别在原图中和要变换的目标图中取三个点,形成对应的三对点对。
    srcPoints[0] = Point2f(0,0);  
    srcPoints[1] = Point2f(0,src.rows-1);  
    srcPoints[2] = Point2f(src.cols-1,0);  
    dstPoints[0] = Point2f(0,src.rows*0.3);  
    dstPoints[1] = Point2f(src.cols*0.2,src.rows*0.7);  
    dstPoints[2] = Point2f(src.cols*0.7,src.rows*0.2);  
  
    Mat M1 = getAffineTransform(srcPoints,dstPoints);//根据三对点对对计算仿射变换矩阵  
    warpAffine(src,dst_warp,M1,src.size());//根据仿射变换矩阵进行仿射变换,变换结果保存在dst_warp中。  
  
    //进行旋转和缩放变换  
    Point2f center(src.cols/2,src.rows/2);//设定旋转中心  
    double angle = 60;//设定逆时针旋转45度  
    double scale = 0.6;//设定缩放比例值为0.6
  
    Mat M2 = getRotationMatrix2D(center,angle,scale);//计算旋转加缩放的变换矩阵  
    warpAffine(dst_warp,dst_warpRotateScale,M2,src.size());//进行仿射变换  
	namedWindow( "原图", CV_WINDOW_AUTOSIZE );  
    imshow( "原图", src );  
    namedWindow( "仿射变换", CV_WINDOW_AUTOSIZE );  
    imshow( "仿射变换", dst_warp );  
    namedWindow("旋转+缩放", CV_WINDOW_AUTOSIZE );  
    imshow( "旋转+缩放",dst_warpRotateScale );  
    waitKey(0);  
	cvDestroyWindow("原图");
	cvDestroyWindow("仿射变换");
	cvDestroyWindow("旋转+缩放");
    return 0;  
}  

但是在第二次仿射变换时,如果将图像的缩放比例变为3或是以上,将会出现如图(我们不远看到的情况)情况:


这是我们不愿意看到的!我们应该通过计算放大图像尺寸,博客:小魏的修行路给了我们相应的方法:点击打开链接

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多