opencv实现旋转+倾斜

原创 2012年03月22日 16:09:23
#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;
}


最终效果图:

Opencv+C++之身份证识别(一)

五月份各种课程,也是最后一个学期了,所以就没有跟大家分享自己的一些所学。现在课程终于结束了,即将开始下一阶段的项目开发,所以趁这个间隙把前段时间做的一些东西做一个总结吧。 言归正传,对各种证件的识别...
  • dddxxxx
  • dddxxxx
  • 2016年07月22日 10:08
  • 2804

使用OpenCv的cvMinAreaRect2函数获取轮廓的可倾斜最小矩形区域

procedure TFrmMain.BtnFreeManClick(Sender: TObject); var   oImg, oImg2, oImg3: PIplImage;   conto...

MFC中OpenCV的使用

本文特别感谢 CVMFC(pund.com),在此基础上进行更新修正、扩展得到的。     得到的程序如上图所示。本文的意图在于简单的介绍一下程序开发中的有价值的方法,以便后来者能快速入手。程序...

【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析

目录(?)[-] 一设定感兴趣区域ROIregion of interest ROI区域定义的两种方法 二初级图像混合线性混合操作 addWeighted函数代码解析 1读取...

opencv实现图片旋转

  • 2016年04月11日 20:53
  • 38KB
  • 下载

Opencv实现图像旋转,非常简单,几行代码

opencv 图像旋转操作 几行代码即可

使用OpenCL+OpenCV实现图像旋转(一)

基于VS2010开发平台,使用OpenCL+OpenCV实现了图像的旋转功能。

opencv实现图像旋转

1.旋转后图像变大,但是原图像部分保持不变 法1: #include "cv.h" #include "highgui.h" int main() { double degree =...

Python + OpenCV实现基于傅里叶变换(FFT)的旋转文本校正(文字方向检测)

OpenCV实现基于傅里叶变换的旋转文本校正 from: http://johnhany.net/2013/11/dft-based-text-rotation-correction/ 发布于 2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv实现旋转+倾斜
举报原因:
原因补充:

(最多只允许输入30个字)