opencv实现旋转+倾斜

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值