OpenCV中对avi视频的处理,并修改视频大小

接触OpenCV不久,学的不是很全面,主要用的多的是与自己现在项目有关的部分,跟大家分享一下。

关于OpenCV的配置问题,网上有很多的例程,跟着做就好了,我使用的是vs2010平台。

1、OpenCV对avi视频的处理

OpenCV中提供了大量的图形图像处理的函数,包括读取本地的图片cvLoadImage函数,而处理avi视频可以用cvCreateFileCapture先读取本地的视频,然后调用cvQueryFrame捕获avi视频中的帧图像,后续再可以对这些图像进行处理;在捕获出每一帧后,在陆续的显示出来,最后达到读取视频并播放的功能。

2、修改视频显示的大小

主要就是先通过捕获帧图像,然后调用cvResize来修改图像到你希望的大小。

void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );  
src  
输入图像.  
dst  
输出图像.  
interpolation  
插值方法:  
CV_INTER_NN - 最近邻插值,  
CV_INTER_LINEAR - 双线性插值
CV_INTER_AREA - 使用象素关系重采样
CV_INTER_CUBIC - 立方插值.

我使用的差值方法是双线性差值方法,放大的效果会好些。我们的图像数据结构都是IplImage类型的,修改大小需要先了解下这种类型,资料书上都有很详细的介绍。

 

我的函数

void PlayFile(CString FilePath)
{
	char temp[90];
	sprintf(temp,"%s",FilePath);//保存avi视频路径
	CvCapture* capture=cvCreateFileCapture(temp);//读取视频
	IplImage* frame=0; //原始图像指针
	IplImage* src1=0;//目标图像1指针
	IplImage* src2=0;//目标图像1指针
	CvSize dst1;   //目标图像1尺寸
	CvSize dst2;   //目标图像1尺寸
	float scale1 = 0.5;  //缩放为原始图片的一半大小   
    	float scale2 = 2;  //缩放为原始图片的一倍大小  
	 while(1)
	 {                                  
		 frame = cvQueryFrame(capture);
		 if(!frame) 
			 break;
		 dst1.width = frame->width * scale1;  //定义目标图像1的宽   
		 ds1t.height = frame->height * scale1;//定义目标图像1的高 
 		 dst2.width = frame->width * scale2;  //定义目标图像2的宽   
		 ds12.height = frame->height * scale2;//定义目标图像2的高 
		 src1 = cvCreateImage( dst1, frame->depth, frame->nChannels); //构造目标图象1
 		 src2 = cvCreateImage( dst2, frame->depth, frame->nChannels); //构造目标图象2
		 cvResize(frame, src1, CV_INTER_LINEAR); //缩放源图像到目标图像1 
		 cvResize(frame, src2, CV_INTER_LINEAR); //缩放源图像到目标图像2
		 cvNamedWindow( "src1",   CV_WINDOW_AUTOSIZE ); //创建用于显示源图像的窗口   
    		 cvNamedWindow( "src2",   CV_WINDOW_AUTOSIZE ); //创建用于显示目标图像1的窗口 
		 cvShowImage("src1",src1);//显示目标图像1
		 cvShowImage("src2",src2);//显示目标图像2
		 char c = cvWaitKey(33);
		 if(c == 27)
			 break;
	 }                  
	 cvReleaseCapture(&capture);
	 cvReleaseImage(&frame);
	 cvReleaseImage(&src1);
	 cvReleaseImage(&src2);
	 cvDestroyWindow( "src1" );
 	 cvDestroyWindow( "src2" );
	 ::AfxMessageBox(_T("Done!"));
}


参考资料:

1、学习OpenCV,刘瑞祯,于仕祺,清华大学出版社

2、图像缩放--OpenCV cvResize函数--最近邻插值---双线性插值--基本原理            地址:http://blog.chinaunix.net/uid-26020768-id-3187769.html

你可能感兴趣的:(OpenCV中对avi视频的处理,并修改视频大小)