视频抓取不适用于OpenCV

时间:2014-01-18 07:29:33

标签: c++ opencv video-capture

我正在使用这段代码来抓取视频中的帧:

#include <stdio.h>
#include <stdlib.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main (int argc, char** argv)
{
//initializing capture from file
CvCapture * capture = cvCaptureFromAVI ("/home/<some_file>.avi");

//Capturing a frame
IplImage* img = 0;
if(!cvGrabFrame(capture))      //capture a frame
{
cout << Could not grab a frame\n\7";
exit(0);
}
img=cvRetrieveFrame(capture);    //retrieve the captured frame



//free resources
cvReleaseCapture(&capture);

}

返回:

Could not grab a frame

其他细节: 我曾使用代码将网络摄像头视频源保存到我想要抓取帧的文件中。 我用了这段代码:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main( int argc, char** argv ) {
CvCapture* capture;

capture = cvCreateCameraCapture(0);

assert( capture != NULL );

IplImage* bgr_frame = cvQueryFrame( capture );

CvSize size = cvSize(
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_WIDTH),
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_HEIGHT)
                     );

cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE );

CvVideoWriter *writer = cvCreateVideoWriter(    "/Users/user/Desktop/OpenCV_trial/OpenCV_trial/vidtry.AVI",
                                            CV_FOURCC('D','I','V','X'),
                                            30,
                                            size
                                            );

while( (bgr_frame = cvQueryFrame( capture )) != NULL ) 
{
    cvWriteFrame(writer, bgr_frame );
    cvShowImage( "Webcam", bgr_frame );
    char c = cvWaitKey( 33 );
    if( c == 27 ) break;
}
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "Webcam" );
return( 0 );
}

有谁知道我可能会出错?我正在使用Ubuntu Quantal在Beagleboard -xM上运行OpenCV-2.4.3。

1 个答案:

答案 0 :(得分:0)

我不太确定您的确切问题是什么,但如果您想从视频中抓取,则至少应该有一个循环。
您的错误原因可能是您的视频文件不可用。你试过另一个吗?文件的完整路径?或者将文件直接放入工作目录并进行检查 另一个原因可能是第一帧的问题(这有时会发生)。因此,请尝试删除退出,并在所有帧上使用循环将代码括起来。
这是一个显示给定视频文件的示例(考虑使用C ++ - 接口):

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main (int argc, char** argv)
{
//initializing capture from file
Mat img;
VideoCapture capture("a.avi");  
if(!capture.isOpened())
{
    cout<<"Could not open video!\n";
    return 1;
}       

while(true)
{
    //Capturing a frame
    capture >> img;
    if(!img.empty())
    {
        imshow("Video",img);
    }       
    else    
    {   
        cout <<"Could not grab a frame\n";
        break;
    }

    if(waitKey(5) >= 0) 
        break;
}   
return 0;
}

如果文件“a.avi”在程序的当前工作目录中,则该程序在我的PC上运行。