OpenCV寻求功能/倒带

Cen*_*noc 22 video opencv seek

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

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

Adi*_*Adi 42

使用cvSetCaptureProperty()可以循环遍历帧,可以是几毫秒,也可以是序数帧号.

int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

例:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

bool VideoCapture::set(int property_id, double value)
Run Code Online (Sandbox Code Playgroud)