仿射变换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> #include <stdio.h>
#
using namespace cv; using namespace std; /// Global variables char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate"; /** @function main */
/// Set your 3 points to lculate the Affine Transform srcTri[0] = Point2f( 0,0 ); srcTri[1] = Point2f( src.cols - 1, 0 ); srcTri[2] = Point2f( 0, src.rows - 1 );
• /// Get the rotation matrix with the specifications above • rot_mat = getRotationMatrix2D( center, angle, scale ); • • • • • • • /// Rotate the warped image warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() ); /// Show what you got namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); namedWindow( warp_window, CV_WINDOW_AUTOSIZE ); imshow( warp_window, warp_dst );
2. 让我们解释好一点 b。从M与2图像,我们可以分析最 简单的情况下,看下图:
点1、2和3形成图1中的三角形,映射到图2,仍然 形成一个三角形,但是我们发现它明显不同于图1。如 果我们理解这些3点的仿射变换,我们可以把这个发现 应用到整个图像的像素当中去。
下面大家看一个由编程来实现的仿射变换。
dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 ); dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 ); dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
/// Load the image src = imread( argv[1], 1 );
/// Set the dst image the same type and size as src warp_dst = Mat::zeros( src.rows, src.cols, src.type() );
• •
namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE ); imshow( warp_rotate_window, warp_rotate_dst );
• /// Wait until user exits the program • waitKey(0); • • return 0; }
int main( int argc, char** argv ) { Point2f srcTri[3]; Point2f dstTri[3]; Mat rot_mat( 2, 3, CV_32FC1 ); Mat warp_mat( 2, 3, CV_32FC1 ); Mat src, warp_dst, warp_rotate_dst;
/// Get the Affine Transform warp_mat = getAffineTransform( srcTri, dstTri ); /// Apply the Affine Transform just found to the src image warpAffine( src, warp_dst, warp_mat, warp_dst.size() ); /** Rotating the image after Warp */ /// Compute a rotation matrix with respect to the center of the image Point center = Point( warp_dst.cols/2, warp_dst.rows/2 ); double angle = -50.0; double scale = 0.6;
• 你可以看到,从本质上讲,一个仿射变换表示两幅图像 之间的关系。
• 通常代表一个仿射变换的方法是使用一个2 \ 3次矩阵。
x 如果我们想要改变一个2 维向量X = y 可以利用矩阵A和B来实现:
, 我们
x y
或者
我们怎样才能实现一个仿射变换呢?
1 . 我们提到一个仿射变换基本上是两幅图像之间的 关系。这样的话,这种关系可以分两个方面: a.我们知道X和T,我们也知道他们是相关的。那么我们 只需找到M。 b.我们知道M和X,为了获得T,我们只需要应用公式T = M•X。我们知道,M的信息可能是显式(即2×3矩阵), 也可以是一个点之间的几何关系。
Affine Transformations 仿射变换
什么是仿射变换呢?
仿射变换,又称仿射映射,是指在几何中,一个向量进 行一次线性变换并接上一个平移,变换为另一个向量 空间 任何转换,都可以表达矩阵乘法(线性变换)的形式,后跟一 个向量加法(平移)。 从上面,我们可以使用一个仿射变换来完成: a. 旋转(线性变换) b. 平移(向量加法) c. 规模操作(线性变换)
#
using namespace cv; using namespace std; /// Global variables char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate"; /** @function main */
/// Set your 3 points to lculate the Affine Transform srcTri[0] = Point2f( 0,0 ); srcTri[1] = Point2f( src.cols - 1, 0 ); srcTri[2] = Point2f( 0, src.rows - 1 );
• /// Get the rotation matrix with the specifications above • rot_mat = getRotationMatrix2D( center, angle, scale ); • • • • • • • /// Rotate the warped image warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() ); /// Show what you got namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); namedWindow( warp_window, CV_WINDOW_AUTOSIZE ); imshow( warp_window, warp_dst );
2. 让我们解释好一点 b。从M与2图像,我们可以分析最 简单的情况下,看下图:
点1、2和3形成图1中的三角形,映射到图2,仍然 形成一个三角形,但是我们发现它明显不同于图1。如 果我们理解这些3点的仿射变换,我们可以把这个发现 应用到整个图像的像素当中去。
下面大家看一个由编程来实现的仿射变换。
dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 ); dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 ); dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
/// Load the image src = imread( argv[1], 1 );
/// Set the dst image the same type and size as src warp_dst = Mat::zeros( src.rows, src.cols, src.type() );
• •
namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE ); imshow( warp_rotate_window, warp_rotate_dst );
• /// Wait until user exits the program • waitKey(0); • • return 0; }
int main( int argc, char** argv ) { Point2f srcTri[3]; Point2f dstTri[3]; Mat rot_mat( 2, 3, CV_32FC1 ); Mat warp_mat( 2, 3, CV_32FC1 ); Mat src, warp_dst, warp_rotate_dst;
/// Get the Affine Transform warp_mat = getAffineTransform( srcTri, dstTri ); /// Apply the Affine Transform just found to the src image warpAffine( src, warp_dst, warp_mat, warp_dst.size() ); /** Rotating the image after Warp */ /// Compute a rotation matrix with respect to the center of the image Point center = Point( warp_dst.cols/2, warp_dst.rows/2 ); double angle = -50.0; double scale = 0.6;
• 你可以看到,从本质上讲,一个仿射变换表示两幅图像 之间的关系。
• 通常代表一个仿射变换的方法是使用一个2 \ 3次矩阵。
x 如果我们想要改变一个2 维向量X = y 可以利用矩阵A和B来实现:
, 我们
x y
或者
我们怎样才能实现一个仿射变换呢?
1 . 我们提到一个仿射变换基本上是两幅图像之间的 关系。这样的话,这种关系可以分两个方面: a.我们知道X和T,我们也知道他们是相关的。那么我们 只需找到M。 b.我们知道M和X,为了获得T,我们只需要应用公式T = M•X。我们知道,M的信息可能是显式(即2×3矩阵), 也可以是一个点之间的几何关系。
Affine Transformations 仿射变换
什么是仿射变换呢?
仿射变换,又称仿射映射,是指在几何中,一个向量进 行一次线性变换并接上一个平移,变换为另一个向量 空间 任何转换,都可以表达矩阵乘法(线性变换)的形式,后跟一 个向量加法(平移)。 从上面,我们可以使用一个仿射变换来完成: a. 旋转(线性变换) b. 平移(向量加法) c. 规模操作(线性变换)