【问题标题】:OpenCV Seek Function/RewindOpenCV 搜索功能/倒带
【发布时间】:2010-06-04 13:39:19
【问题描述】:

我一直在尝试使用 C++ 中的 OpenCV 查找/实现查找和倒带功能(用于视频 (.avi)),但除了浏览整个文件并保存之外,我找不到其他方法每个图像。有没有其他办法?

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

【问题讨论】:

  • 顺便提一下,如果您在任何时候发现搜索不起作用时遇到困难,OpenCV 搜索在 flv 上将无法正常工作。花了我一天时间才弄明白!!!

标签: video opencv seek


【解决方案1】:

使用 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 字符代码(仅适用于摄像机)。

前两个是你感兴趣的。

编辑:更多信息:)

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

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)

【讨论】:

  • 有什么例子吗?假设我有一个 .avi 文件,我将如何使用它来循环浏览帧?
  • 哇,从来不知道这个!有趣的是,当您太专注于一件事时,您的知识会留下什么空白!
  • 我可以在恒定时间内查询一个帧吗?或者是否需要线性时间(或其他多项式时间)才能找到随机位置。
  • 这不适用于使用关键帧的视频编解码器,opencv 只会将您导航到关键帧。
  • 我正在使用 CV_CAP_POS_FRAMES,而且速度非常慢。它比抓取每一帧要快一点。 OpenCV 是在幕后做的吗?有什么方法可以像使用标准视频查看器一样,在恒定时间内跳入视频?
【解决方案2】:

我认为您必须将整个文件读入 IplImages 数组,然后完成该操作。原因是,cvQueryFrame 是一个单向进程,它按顺序一次读取一帧。我想不出别的办法。根据视频的长度,初始化时间可能不会太长。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      highgui 库中,您会找到用于搜索栏的函数(cvCreateTrackbar 和朋友)。

      【讨论】:

      • 它的描述方式听起来不像是一个搜索栏;听起来像是一个普通的轨迹栏。此外,我在网上找到的每个示例都将其用于其他随机 shiz,例如更改图片色调。
      • 您可以将轨迹栏挂钩到您想要的任何变量/事件 - 包括文件位置。与内置搜索栏相比,您需要做更多的工作,但它就在那里
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多