close

 

Affine & Perspective Transformation

 

Input : Two frame's gray image "iplT0gray" & "iplT1gray", to get two frame's corners.

 
IplImage* eig_image = cvCreateImage( cvGetSize( iplT0gray ) , IPL_DEPTH_32F , 1 );
IplImage* temp_image = cvCreateImage( cvGetSize( iplT0gray ) , IPL_DEPTH_32F , 1 );
//---------------------------------------------------------
const int MAX_CORNERS = INT_POINT_SIZE;
//---------------------------------------------------------
CvPoint2D32f corners[MAX_CORNERS] = {0}, corners2[MAX_CORNERS] = {0};
//---------------------------------------------------------
double quality_level = 0.05, min_distance = 2, k = 0.04;
int eig_block_size = 3, use_harris = false, corner_count = MAX_CORNERS;
//---------------------------------------------------------
IplImage* pyramid1 = cvCreateImage( cvGetSize( iplT0gray ) , IPL_DEPTH_8U , 1 );
IplImage* pyramid2 = cvCreateImage( cvGetSize( iplT0gray ) , IPL_DEPTH_8U , 1 );
//---------------------------------------------------------
char OF_FoundFeature[MAX_CORNERS];	
float OF_FeatureError[MAX_CORNERS];
CvTermCriteria OF_TerminationCriteria = cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 );
//---------------------------------------------------------
cvGoodFeaturesToTrack( iplT0gray , eig_image, temp_image , corners , & corner_count , quality_level , min_distance , NULL , eig_block_size , use_harris , k );
cvCalcOpticalFlowPyrLK( iplT0gray , iplT1gray , pyramid1 , pyramid2 , corners , corners2 ,
					corner_count , cvSize(3,3) , 5 , OF_FoundFeature , OF_FeatureError, OF_TerminationCriteria , 0 );
 

Using the corners, we can get these two frame's transformation matrix, and warping back.

* You need to using SIFT or other methods to get these two frame's corners ( feature points ), when these two frame with big change, like scaling, rotation, etc.

 

1. )  Affine Transformation :

 
CvMat* H = cvCreateMat( 2 , 3 , CV_32FC1 );
cvGetAffineTransform( corners2 , corners , H );
cvWarpAffine( iplSrc , iplObj , H );
 

 

2. )  Perspective Transformation :

 
CvMat* H = cvCreateMat( 3 , 3 , CV_32FC1 );
cvGetPerspectiveTransform( corners2 , corners , H );
cvWarpPerspective( iplSrc , iplObj , H , CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS , CV_RGB(255,0,0) );
 

 

3. )  Perspective Transformation ( with RANSAC ) :

 
CvMat* H = cvCreateMat( 3 , 3 , CV_32FC1 );
CvMat c = cvMat( 1 , 100 , CV_32FC2 , corners );
CvMat c2 = cvMat( 1 , 100 , CV_32FC2 , corners2 );
cvFindHomography( & c2 , & c , H , CV_RANSAC , 30 );
cvWarpPerspective( iplSrc , iplObj , H , CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS , CV_RGB(255,0,0) );
 

 

 

arrow
arrow

    Cuby 56 發表在 痞客邦 留言(0) 人氣()