透视变换和仿射变换具有很大的相同特性,前面提到了放射变化,这里再次把它拿出和透视变换进行比较
1 #include"cv.h" 2 #include"highgui.h" 3 using namespace cv; 4 void WarpPerspective(IplImage *img); 5 void WarpFangshe(IplImage *img); 6 int main() 7 { 8 IplImage *getimg = cvLoadImage("e:/picture/Wife2.jpg"); 9 IplImage *img = cvCreateImage(cvSize(350,450),getimg->depth,getimg->nChannels); 10 cvResize(getimg,img); 11 WarpPerspective(img); 12 //WarpFangshe(img); 13 cvWaitKey(); 14 cvDestroyAllWindows(); 15 return 0; 16 } 17 //透视变换 18 //任意四边形的变换 19 //透视变换需要的设置四个点 20 void WarpPerspective(IplImage *img) 21 { 22 IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,img->nChannels); 23 CvMat *mat = cvCreateMat(3,3,CV_32FC1); 24 CvPoint2D32f ori_point[4], dst_point[4]; 25 ori_point[0].x = 0; ori_point[0].y = 0; 26 ori_point[1].x = img->width - 1; ori_point[1].y = 0; 27 ori_point[2].x = 0; ori_point[2].y = img->height-1; 28 ori_point[3].x = img->width - 1; ori_point[3].y = img->height - 1; 29 dst_point[0].x = img->width / 2; dst_point[0].y = img->height*0.05; 30 dst_point[1].x = img->width*0.3;; dst_point[1].y = img->height / 2; 31 dst_point[2].x = img->width*0.7; dst_point[2].y = img->height / 2; 32 dst_point[3].x = img->width / 2; dst_point[3].y = img->height*0.9; 33 //获取映射矩阵 34 cvGetPerspectiveTransform(ori_point,dst_point,mat); 35 cvWarpPerspective(img,dst,mat); 36 //cvFlip(dst,dst,1); 37 cvNamedWindow("origin"); 38 cvNamedWindow("Warp"); 39 cvShowImage("origin",img); 40 cvShowImage("Warp",dst); 41 cvReleaseImage(&img); 42 cvReleaseImage(&dst); 43 cvReleaseMat(&mat); 44 } 45 void WarpFangshe(IplImage *img)//仿射变换 46 { 47 //定义两个CvPoint2D32F的数组 48 //第一个数组用来标定将要变换的原始图像中的区域 49 //第二个数组用来标定变换后的图像在窗口中的位置 50 CvPoint2D32f SrcTri[3], DstTri[3]; 51 //定义仿射映射矩阵,然后计算(2*3的矩阵) 52 CvMat *warp_mat = cvCreateMat(2, 3, CV_32FC1); 53 CvMat *rot_mat = cvCreateMat(2, 3, CV_32FC1); 54 IplImage *src, *dst; 55 src = img; 56 dst = cvCloneImage(src); 57 SrcTri[0].x = 0; SrcTri[0].y = 0; 58 SrcTri[1].x = src->width - 1; SrcTri[1].y = 0; 59 SrcTri[2].x = 0; SrcTri[2].y = src->height - 1; 60 DstTri[0].x = 0; DstTri[0].y = src->height*0.33; 61 DstTri[1].x = src->width*0.85; DstTri[1].y = src->height*0.25; 62 DstTri[2].x = src->width*0.15; DstTri[2].y = src->height*0.7; 63 //获取映射矩阵 64 cvGetAffineTransform(SrcTri, DstTri, warp_mat); 65 //映射变换 66 cvWarpAffine(src, dst, warp_mat); 67 cvCopy(dst, img); 68 cvNamedWindow("Warp"); 69 //cvShowImage("Warp",dst); 70 //下面是对变换后的图像进一步旋转 71 CvPoint2D32f center = cvPoint2D32f(src->width / 2, src->height / 2); 72 double angle = 50.0; 73 double scale = 0.8; 74 //旋转图像 75 //上面center是旋转中心 76 //下面函数的第二个和第三个参数给出了旋转的角度和缩放的尺度 77 //最后一个参数是输出的映射矩阵 78 /*cv2DRotationMatrix( 79 CvPoint2D32F center 80 double angle 81 double scale 82 CvMat *map_matrix 83 )*/ 84 cv2DRotationMatrix(center, angle, scale, rot_mat); 85 cvWarpAffine(src, dst, rot_mat); 86 cvShowImage("Warp", dst); 87 cvReleaseImage(&img); 88 cvReleaseImage(&dst); 89 }