仿射变换
2014-01-12 13:50
363 查看
仿射几何就是把欧几里得几何学中的长度、面积、和角度测量都去掉以后剩下的东西,但是平行的概念和直线上点的比例仍然保留。两个仿射空间的X和Y之间的仿射变换是X和Y之间的双射,把m维的子空间映射为m维的子空间,把平行的子空间映射为平行的子空间,并保持等价的仿射坐标不变。判断一个变换是否是仿射变换也可以使用它所具有的把直线映射到直线且不改变平行线段之间带符号长度比例关系的性质决定。仿射变换(Affine Transformation或 Affine Map)是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),仿射变换是不保角度和距离的。仿射变换包括:平移变换,旋转变换,错切变换,比例变换。不共线的三对对应点决定了一个唯一的仿射变换,在仿射变换下图形的不变性质和不变的量称作仿射性质,是仿射几何中的重要研究内容,仿射变换使用齐次坐标表示如下:
刚体:不会产生形变;刚体变换:在变换中不会改变图形的形状。平移,旋转都是刚体变换;缩放,错切会改变物体的形状,不是刚体变换。
1.平移变换:将一点移动到另一点,变换矩阵为:
2.旋转变换变换:将图形进行旋转,变换矩阵为:
3.缩放变换:
4.错切变换:也叫剪切变换
但是在第二次仿射变换时,如果将图像的缩放比例变为3或是以上,将会出现如图(我们不远看到的情况)情况:
这是我们不愿意看到的!我们应该通过计算放大图像尺寸,博客:小魏的修行路给了我们相应的方法:点击打开链接
刚体:不会产生形变;刚体变换:在变换中不会改变图形的形状。平移,旋转都是刚体变换;缩放,错切会改变物体的形状,不是刚体变换。
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或是以上,将会出现如图(我们不远看到的情况)情况:
这是我们不愿意看到的!我们应该通过计算放大图像尺寸,博客:小魏的修行路给了我们相应的方法:点击打开链接
相关文章推荐
- 年份的读法与读数字不同
- 唐山校友会会长苏伟与徐飞校长的一次短信交流
- IOS之操作表ActionSheet(免Delegate)
- 数据存储过程
- 四代i5超值配置单,年度最便宜4代
- 元素的position:absolute;属性和margin-left:480px; margin-top:-20px配合使用
- Cython基础--Cython入门
- Fib数列问题2
- 如何发挥协调战斗能力
- 学习笔记五:Ubuntu下载编译Android源码
- Android 学习杂记
- php程序开发该怎么学,作为过来人的几点建议!
- 黑马程序员------- 网络编程-------
- 数列
- Sky Box
- ajax 基础学习
- 小强的HTML5移动开发之路(16)——神奇的拖放功能
- 小强的HTML5移动开发之路(16)——神奇的拖放功能
- 明明的随机数
- 利用mutt发外部邮件