关闭

opencv实现旋转+倾斜

1487人阅读 评论(0) 收藏 举报
#include "cv.h"
#include "highgui.h"

int main()
{
	IplImage *imgSrc = cvLoadImage("l:\\test\\5.jpg");
	int w_src = imgSrc->width;
	int h_src = imgSrc->height;

	///////////实现旋转////////////////
	double degree1 =30; 
	double angle1 = degree1  * CV_PI / 180.; 
	double a1 = sin(angle1), b1 = cos(angle1); 
	//得到旋转后图像大小
	int w_dst = int(h_src * fabs(a1) + w_src * fabs(b1));
	int h_dst = int(w_src * fabs(a1) + h_src * fabs(b1));
	//得到旋转矩阵
	double map[6];
	CvMat map_matrix = cvMat(2, 3, CV_64FC1, map);
	CvPoint2D32f pt = cvPoint2D32f(w_src / 2, h_src / 2);
	cv2DRotationMatrix(pt, degree1, 1.0, &map_matrix);
	//一定要将中心位置移到目标图像中心
	map[2] += (w_dst - w_src) / 2;
	map[5] += (h_dst - h_src) / 2;

	IplImage *imgDst = cvCreateImage(cvSize(w_dst, h_dst), 8, 3);
	cvWarpAffine(imgSrc, imgDst,&map_matrix,CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,cvScalarAll(0));

	///////////旋转的基础上倾斜////////////////
	double degree2 =30; 
	double angle2 = degree2  * CV_PI / 180.; 
	double a2 = sin(angle2), b2 = cos(angle2); 
	//由对应点关系计算倾斜矩阵
	CvPoint2D32f src_point[4];
	CvPoint2D32f dst_point[4];
	src_point[0].x=-w_dst/2;
	src_point[0].y=-h_dst/2;
	dst_point[0].x=-w_dst/2-h_dst/2*fabs(a2)*fabs(b2);
	dst_point[0].y=-h_dst/2*pow(fabs(b2),2.0);
	src_point[1].x=w_dst/2;
	src_point[1].y=-h_dst/2;
	dst_point[1].x=w_dst/2-h_dst/2*fabs(a2)*fabs(b2);
	dst_point[1].y=-h_dst/2*pow(fabs(b2),2.0);
	src_point[2].x=w_dst/2;
	src_point[2].y=h_dst/2;
	dst_point[2].x=w_dst/2+h_dst/2*fabs(a2)*fabs(b2);
	dst_point[2].y=h_dst/2*pow(fabs(b2),2.0);
	src_point[3].x=-w_dst/2;
	src_point[3].y=h_dst/2;
	dst_point[3].x=-w_dst/2+h_dst/2*fabs(a2)*fabs(b2);
	dst_point[3].y=h_dst/2*pow(fabs(b2),2.0);
	double m[6];
	CvMat M = cvMat(2, 3, CV_64FC1, m);
	cvGetAffineTransform(src_point,dst_point,&M);
	int w_dst2 =h_dst*fabs(a2)*fabs(b2)+w_dst;
	int h_dst2 =h_dst*pow(fabs(b2),2.0);

	IplImage *imgDst2 = cvCreateImage(cvSize(w_dst2, h_dst2), 8, 3);
	cvWarpAffine(imgDst, imgDst2,&M,CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
	//得到感兴趣区域
	int min_x=0;
	int min_y=0;
	int max_x=0;
	int max_y=0;
	bool min_flag=1;
	uchar* old_ptr;
	for( int y=0 ; y<h_dst2; y++)  
	{   
		for (int x=0 ; x<w_dst2; x++)  
		{  
			old_ptr = &((uchar*)(imgDst2->imageData + imgDst2->widthStep*y))[(x)*3];  
			if(old_ptr[0]!=0&&old_ptr[1]!=0&&old_ptr[2]!=0)
			{
				if(y>min_y&&min_flag)	{min_y=y;min_flag=0;}
				if (y>max_y)	max_y=y;
			}
		}  
	}

	min_flag=1;
	for(int x=0 ; x<w_dst2; x++)  
	{   
		for ( int y=0 ; y<h_dst2; y++)  
		{  
			old_ptr = &((uchar*)(imgDst2->imageData + imgDst2->widthStep*y))[(x)*3];  
			if(old_ptr[0]!=0&&old_ptr[1]!=0&&old_ptr[2]!=0)
			{
				if(x>min_x&&min_flag)	{min_x=x;min_flag=0;}
				if (x>max_x)	max_x=x;
			}
		}  
	}

	CvRect rect;
	rect.x=min_x;
	rect.y=min_y;
	rect.width=max_x-min_x;
	rect.height=max_y-min_y;
	cvSetImageROI(imgDst2,rect);
	IplImage *imgDst3 = cvCreateImage(cvSize(rect.width,rect.height), 8, 3);
	cvCopyImage(imgDst2,imgDst3);
	cvResetImageROI(imgDst2);
	
	cvNamedWindow ("src", 1);
	cvShowImage ("src", imgSrc);
	cvNamedWindow( "dst", 1 );
	cvShowImage( "dst", imgDst);
	cvNamedWindow( "dst2", 1 );
	cvShowImage( "dst2", imgDst2);
	cvNamedWindow( "dst3", 1 );
	cvShowImage( "dst3", imgDst3);//最终效果图
	cvWaitKey(0);

	cvReleaseImage(&imgSrc);
	cvReleaseImage(&imgDst);
	cvReleaseImage(&imgDst2);
	cvReleaseImage(&imgDst3);
	return 0;
}


最终效果图:

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:323338次
    • 积分:3470
    • 等级:
    • 排名:第9569名
    • 原创:84篇
    • 转载:17篇
    • 译文:0篇
    • 评论:97条