#include "cv.h"
#include "highgui.h"
int main()
{
double degree =30;
double angle = degree * CV_PI / 180.;
IplImage *imgSrc = cvLoadImage("l:\\test\\5.jpg");
int w_src = imgSrc->width;
int h_src = imgSrc->height;
cvNamedWindow ("src", 1);
cvShowImage ("src", imgSrc);
CvPoint2D32f src_point[4];
CvPoint2D32f dst_point[4];
src_point[0].x=-w_src/2;
src_point[0].y=-h_src/2;
dst_point[0].x=-w_src/2-h_src/2*sin(angle)*cos(angle);
dst_point[0].y=-h_src/2*cos(angle)*cos(angle);
src_point[1].x=w_src/2;
src_point[1].y=-h_src/2;
dst_point[1].x=w_src/2-h_src/2*sin(angle)*cos(angle);
dst_point[1].y=-h_src/2*cos(angle)*cos(angle);
src_point[2].x=w_src/2;
src_point[2].y=h_src/2;
dst_point[2].x=w_src/2+h_src/2*sin(angle)*cos(angle);
dst_point[2].y=h_src/2*cos(angle)*cos(angle);
src_point[3].x=-w_src/2;
src_point[3].y=h_src/2;
dst_point[3].x=-w_src/2+h_src/2*sin(angle)*cos(angle);;
dst_point[3].y=h_src/2*cos(angle)*cos(angle);
float m[6];
CvMat M= cvMat(2, 3, CV_64FC1, m);
cvGetAffineTransform( src_point, dst_point,&M);
int w_dst2 =h_src*cos(angle)*sin(angle)+w_src;
int h_dst2 =h_src*cos(angle)*cos(angle);
IplImage *imgDst2 = cvCreateImage(cvSize(w_dst2, h_dst2), 8, 3);
cvWarpAffine(
imgSrc,
imgDst2,
&M,
CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
cvScalarAll(0)
);
cvNamedWindow( "dst2", 1 );
cvShowImage( "dst2", imgDst2);
cvWaitKey(0);
cvReleaseImage(&imgSrc);
cvReleaseImage(&imgDst2);
return 0;
}
//求仿射矩阵时,仅前三个点即可