代码之家  ›  专栏  ›  技术社区  ›  Cenoc

opencv寻道功能/倒带

  •  21
  • Cenoc  · 技术社区  · 15 年前

    我一直试图用C++中的OpenCV来查找/实现一个查找和倒带函数(用于视频(.avi)),但是我无法找到一种方法,而不是遍历整个文件并保存每个图像。还有别的办法吗?

    任何帮助都将不胜感激;提前谢谢!

    4 回复  |  直到 6 年前
        1
  •  39
  •   Jean-Philippe Jodoin    12 年前

    使用cvsetCaptureProperty()可以在帧之间循环,可以是毫秒,也可以是序数帧。

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

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

    1. cv_cap_prop_pos_msec公司 -从文件开始以毫秒为单位的位置
    2. cv_cap_prop_pos_帧 -框架中的位置
    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字符代码(仅适用于相机)。

    前两个是你感兴趣的。

    编辑:详细信息:)

    只需使用不同的帧索引重复调用上述函数,就可以在帧之间循环。

    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和更高)将使用该方法而不是使用相同的属性Type ID和值。

    bool VideoCapture::set(int property_id, double value)
    
        2
  •  1
  •   n00dle    15 年前

    我认为你必须把整个文件读入一组iplmimages中,然后进行处理。原因是,cvQueryFrame是一个单向过程,它按顺序一次读取一个帧。我想不出别的办法。根据视频的长度,初始化时间可能不会太长。

    如您所说,cvtrackbar主要用于更改参数。它们改变变量的值(以指针形式作为参数给出)并抛出回调函数。不幸的是,据我所知,它们是Highgui中唯一的按钮样式元素

        3
  •  1
  •   Xin Yang    6 年前

    对于C++和OpenCV3.4,框架索引是要查找的位置。

    Mat frame;
    VideoCapture capture("test.avi");
    capture.set(CAP_PROP_POS_FRAMES, frame_index);
    capture>>frame;
    
        4
  •  0
  •   Matt Stephenson    15 年前

    highgui 你可以找到搜索栏的函数库(cvcreatetrackbar和friends)。

    推荐文章