OpenCV读取AVI文件

今天看到网上很多人问,cvCreateFileCapture读取avi,为什么总是返回NULL. 我查了查文献,总结如下:

(源程序附在最下)

问题:为什么我的电脑支持AVI或者能够播出AVI,但为什么使用cvCreateFileCapture函数总返回NULL呢?
答案:尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。 需要把它转换OpenCV支持的AVI文件. OpenCV支持的AVI如下:

Container

FourCC

Name

Description

AVI

'DIB '

RGB(A)

Uncompressed RGB, 24 or 32 bit

AVI

'I420'

RAW I420

Uncompressed YUV, 4:2:0 chroma subsampled

AVI

'IYUV'

RAW I420

identical to I420


转换格式解决方法:
解决方法1 : 下载mencoder.exe , 在window命令行下使用:
 mencoder in.avi -ovc raw -vf format=i420 -o out.avi
(注:我测试了这个方法,没有成功,原因不详,希望有朋友们能够详细讨论一下。)

解决方法2:下载VitualDub , 我使用1.9.4版本
 a. File->Open Video File;
 b. Video->Filters->Add->Convert format; 选择 4:2:0 Planar YCbCr (YV12)或者 32-Bit RGB。
 c. Save as AVI. 保存完毕。
(注:成功使用。)

大家可以测试一下。如果还是不行,请回复,共同讨论一下。


我的源代码,(VS C++ 2008 Expression, WinXP sp3, )
//-------------------------------------------------------------
#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#pragma comment(lib, "ml.lib")
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "cxts.lib")
#pragma comment(lib, "highgui.lib")
#pragma comment(lib, "cvhaartraining.lib")

using namespace std;
int main(int argc, char** argv[])
{
	int key=0;
	char* filename="D:\\CLOCK.avi";
	CvCapture* capture = cvCreateFileCapture(filename);
	double fps=cvGetCaptureProperty(capture, CV_CAP_PROP_FPS );
	cout<<"fps="<<fps<<endl;//print the frame rate per second


	if(capture==NULL)
	{
		cout<<"NO capture"<<endl;
		char a=getchar();
		return 1;
	};    

	IplImage* frame;
	cvNamedWindow("PlayAVI", CV_WINDOW_AUTOSIZE);

	while(1)
	{
		frame = cvQueryFrame( capture );
		if(!frame){ break; }

		cvShowImage("PlayAVI", frame );
		key = cvWaitKey(33);// quit when users press 'ESC'
		if( key == 27 ){ break; }
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("PlayAVI"); 

	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值