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) );
文章標籤
全站熱搜
留言列表