首页 > 代码库 > OpenCV Tutorials —— Affine Transformations

OpenCV Tutorials —— Affine Transformations

仿射变换

 

Affine Transformation

  1. 1,It is any transformation that can be expressed in the form of a matrix multiplication (linear transformation) followed by a vector addition (translation).

  2. 2,From the above, We can use an Affine Transformation to express:

    1. Rotations (linear transformation)   旋转
    2. Translations (vector addition)   平移
    3. Scale operations (linear transformation)  缩放

    you can see that, in essence, an Affine Transformation represents a relation between two images.

  3. 3,The usual way to represent an Affine Transform is by using a 2 \times 3 matrix.

    A = \begin{bmatrix}
     a_{00} & a_{01} \\
     a_{10} & a_{11}
     \end{bmatrix}_{2 \times 2}
 B = \begin{bmatrix}
     b_{00} \\
     b_{10}
     \end{bmatrix}_{2 \times 1}

 M = \begin{bmatrix}
     A & B
     \end{bmatrix}
 =
\begin{bmatrix}
     a_{00} & a_{01} & b_{00} \\
     a_{10} & a_{11} & b_{10}
\end{bmatrix}_{2 \times 3}

    Considering that we want to transform a 2D vector X = \begin{bmatrix}x \\ y\end{bmatrix} by using A and B, we can do it equivalently with:

    T = A \cdot \begin{bmatrix}x \\ y\end{bmatrix} + B or T = M \cdot  [x, y, 1]^{T}

    T =  \begin{bmatrix}
    a_{00}x + a_{01}y + b_{00} \\
    a_{10}x + a_{11}y + b_{10}
    \end{bmatrix}

 

We mentioned that an Affine Transformation is basically a relation between two images. The information about this relation can come, roughly, in two ways:

  1. 1,We know both X and T and we also know that they are related. Then our job is to find M

2,We know M and X. To obtain T we only need to apply T = M \cdot X. Our information for M may be explicit (i.e. have the 2-by-3 matrix) or it can come as a geometric relation between points.

通过参考点找到映射关系 M

对整幅图像应用 M,得到目标图像

 

warp_mat = getAffineTransform( srcTri, dstTri );

 

warpAffine( src, warp_dst, warp_mat, warp_dst.size() );

 

rot_mat = getRotationMatrix2D( center, angle, scale );

 

Code

#include "stdafx.h"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace cv;using namespace std;/// Global variableschar* source_window = "Source image";char* warp_window = "Warp";char* warp_rotate_window = "Warp + Rotate";/** @function main */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;	/// Load the image	src = http://www.mamicode.com/imread("img2.jpg", 1 );	/// Set the dst image the same type and size as src	warp_dst = Mat::zeros( src.rows, src.cols, src.type() );	/// Set your 3 points to calculate the  Affine Transform	srcTri[0] = Point2f( 0,0 );	srcTri[1] = Point2f( src.cols - 1, 0 );	srcTri[2] = Point2f( 0, src.rows - 1 );	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 );	/// 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;	/// 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 );	namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE );	imshow( warp_rotate_window, warp_rotate_dst );	/// Wait until user exits the program	waitKey(0);	return 0;}

OpenCV Tutorials —— Affine Transformations