OpenCV寻求功能/倒带

时间:2010-06-04 13:39:20

标签: video opencv seek

我一直在尝试使用C ++中的OpenCV查找/实现搜索和回放功能(对于视频(.avi)),但我找不到一种方法,除了通过整个文件一次并保存每个图像。还有其他办法吗?

非常感谢任何帮助;提前谢谢!

4 个答案:

答案 0 :(得分:41)

使用cvSetCaptureProperty(),你可以在几毫秒内或按序数帧数循环帧。

int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );

property_id 是您需要使用的属性。它可以是以下之一:

  1. CV_CAP_PROP_POS_MSEC - 从文件开始的位置(以毫秒为单位)
  2. CV_CAP_PROP_POS_FRAMES - 框架中的位置
  3. CV_CAP_PROP_POS_AVI_RATIO - 相对单位的位置(0 - 文件的开头,1 - 文件的结尾)
  4. CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度(仅适用于摄像机)
  5. CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高(仅适用于摄像机)
  6. CV_CAP_PROP_FPS - 帧速率(仅适用于摄像机)
  7. CV_CAP_PROP_FOURCC - 编解码器的4字符代码(仅适用于摄像机)。
  8. 前两个是你感兴趣的。

    编辑:更多信息:)

    您可以通过使用各种帧索引重复调用上述函数来循环遍历帧。

    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex);
    

    示例:

    IplImage*  frame;
    CvCapture* capture = cvCreateFileCapture("test.avi");
    
    /* iterate through first 10 frames */
    for (int i = 0; i < 10; i++)
    {
       /* set pointer to frame index i */
       cvSetCaptureProperty(capture, CV_CAP_POS_FRAMES, i);
    
       /* capture the frame and do sth with it */
       frame = cvQueryFrame(capture);
    }
    

    每次用户点击按钮转发/回放视频时,您都可以执行类似的代码。

    C ++方法(OpenCV 2及更高版本)将使用此方法,而不是使用相同的property_id和value。

    bool VideoCapture::set(int property_id, double value)
    

答案 1 :(得分:1)

我认为你必须将整个文件读入一个IplImages数组,然后完成它。原因是,cvQueryFrame是一个单向进程,它按顺序一次读取一帧。我想不出任何其他方式。根据视频的长度,初始化时间可能不会太糟糕。

cvTrackbars就像你说的那样,主要用于改变参数。它们改变变量的值(作为指针形式的参数给出)并抛出一个回调函数。不幸的是,据我所知,它们是HighGUI中唯一的按钮式元素

答案 2 :(得分:1)

对于C ++和opencv3.4,frame_index是您要查找的位置。

Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;

答案 3 :(得分:0)

highgui库中,您可以找到搜索栏的功能(cvCreateTrackbar和朋友)。