2012-05-17 95 views
0

有谁知道为什么我总是收到空帧?我尝试跳过前五个,仍然为空。cvQueryFrame(capture)总是返回null

int _tmain(int argc, char** argv) 
{ 
CvCapture *capture = cvCaptureFromFile(argv[1]); 

int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
IplImage* frame; 
cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 
while(1) 
{ 
    frame = cvQueryFrame(capture); 
    if(!frame) 
     break; 
    cvShowImage("video", frame); 
    char c = cvWaitKey(1000/fps); 
    if(c == 33) 
     break; 
} 
cvReleaseCapture(&capture); 
cvDestroyWindow("video"); 

return 0; 
} 

回答

2

视频文件必须UNCOMPRESSED avi! 所以实际上我得到空帧,因为cvCapture返回null,因为我的输入视频文件没有解压缩。

+0

尽管我没有明确指出问题,但显然这个答案应该是官方的。尽可能接受它。但总是考虑投票给你帮助你的答案,那些答案会引导你走向正确的轨道。 – karlphillip

+0

这是一个很好的观点。你帮助我找到问题的根源。谢谢! – YahooMania

+0

+1。你钉在一个。解决了我的问题。干杯! – AndyUK

1

我用你的代码进行测试,然后用'xvid'格式的视频运行。 我认为OpenCV的“捕捉”功能可能会处理一些流行和旧格式的视频。 格式为“H264”的视频可能不起作用。

+0

捕获仅适用于未压缩avi's – YahooMania

1

cvCaptureFromFile()失败则返回NULL,我怀疑它是失败的:

CvCapture *capture = cvCaptureFromFile(argv[1]); 
if (!capture) 
{ 
    // print error, quit application 
} 

它通常无法对这些原因之一:要么找不到文件,或者OpenCV的不知道如何打开它。例如,OpenCV不支持.mkv文件。

+0

我把一个.wmv文件在同一文件夹中的应用程序文件(.exe)。我尝试使用VC++在调试属性下将视频传递给应用程序,并将其作为命令行参数。为了调试属性,我指定了Wildlife.wmv,并为命令行参数输入了> HelloWorld.exe“Wildlife.wmv”。 我做错了吗? – YahooMania

+1

尝试使用其他视频类型,例如.AVI。结果将回答你的问题。 – karlphillip

+0

即使使用.avi也会发生同样的情况。有没有一种方法可以确定问题是找不到文件还是不支持? – YahooMania