OpenCV搜寻功能/倒带?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我一直试图在C ++中使用OpenCV来查找/实现seek和rewind函数,但我无法找到一种方法来执行此操作,除了一次完成整个文件并保存每个图像。有没有其他方法?

提问于
用户回答回答于

使用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)
用户回答回答于

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

正如你所说,cvTrackbars主要用于改变参数。它们改变变量的值(作为指针形式的参数给出)并抛出一个回调函数。

扫码关注云+社区

领取腾讯云代金券