对于CV_CAP_PROP_FRAME_COUNT,cvGetCaptureProperty总是返回0!

时间:2009-08-31 08:59:46

标签: opencv

这是O'Reilly Learning Opencv的代码片段,

cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture(argv[1]);
int frames = (int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
if (frames != 0) {
    cvCreateTrackbar("Position", "Example3", &g_slider_postion, frames, onTrackbarSlide);
}

但不幸的是,cvGetCaptureProperty总是返回0.我在雅虎搜索过opencv组,发现了同样的问题。

4 个答案:

答案 0 :(得分:4)

哦,我明白了。我在Learning OpenCV的示例代码中找到了这些代码片段:

/*
OK, you caught us.  Video playback under linux is still just bad.  Part of this is due to FFMPEG, part of this
is due to lack of standards in video files.  But the position slider here will often not work. We tried to at least
find number of frames using the "getAVIFrames" hack below.  Terrible.  But, this file shows something of how to
put a slider up and play with it.  Sorry.
*/
//Hack because sometimes the number of frames in a video is not accessible.
//Probably delete this on Widows
int getAVIFrames(char * fname) {
    char tempSize[4];
    // Trying to open the video file
    ifstream  videoFile( fname , ios::in | ios::binary );
    // Checking the availablity of the file
    if ( !videoFile ) {
      cout << "Couldn’t open the input file " << fname << endl;
      exit( 1 );
    }
    // get the number of frames
    videoFile.seekg( 0x30 , ios::beg );
    videoFile.read( tempSize , 4 );
    int frames = (unsigned char ) tempSize[0] + 0x100*(unsigned char ) tempSize[1] + 0x10000*(unsigned char ) tempSize[2] +    0x1000000*(unsigned char ) tempSize[3];
    videoFile.close(  );
    return frames;
}

答案 1 :(得分:1)

我遇到了同样的问题。它说它可以在Windows上运行,但事实并非如此。我想这是因为我使用Dev-C ++而Dev-C ++使用gcc。虽然我不确定这是不是原因。

答案 2 :(得分:0)

我似乎没有在linux版本(执行ROS安装后安装的版本)中出现此问题,但我在OSX上继续遇到它。我认为这与我使用的OpenCV版本有关(我最近安装了一个版本的Linux)所以我在我的Mac上安装了OpenCV 2.2,但问题仍然存在。

有人知道这是否已在最新版本的存储库中完全更正?

答案 3 :(得分:0)

更糟糕的是我在Windows 7上没有这个问题,然后几天后我用相同的视频文件。没有押韵或理由。