2009-08-31 97 views
3

这是来自O'Reilly的opencv学习的代码片段,对于CV_CAP_PROP_FRAME_COUNT,cvGetCaptureProperty始终返回0!

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

哦,我明白了。我在学习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

我有同样的问题。它说它可以在Windows上工作,但它不会。我想这是因为我使用Dev-C++和Dev-C++使用gcc。虽然我不确定这是否是原因。

0

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

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

0

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