【发布时间】:2010-06-04 13:39:19
【问题描述】:
我一直在尝试使用 C++ 中的 OpenCV 查找/实现查找和倒带功能(用于视频 (.avi)),但除了浏览整个文件并保存之外,我找不到其他方法每个图像。有没有其他办法?
任何帮助将不胜感激;提前谢谢!
【问题讨论】:
-
顺便提一下,如果您在任何时候发现搜索不起作用时遇到困难,OpenCV 搜索在 flv 上将无法正常工作。花了我一天时间才弄明白!!!
我一直在尝试使用 C++ 中的 OpenCV 查找/实现查找和倒带功能(用于视频 (.avi)),但除了浏览整个文件并保存之外,我找不到其他方法每个图像。有没有其他办法?
任何帮助将不胜感激;提前谢谢!
【问题讨论】:
使用 cvSetCaptureProperty() 您可以在帧之间循环,以毫秒为单位或按帧序号。
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
property_id 是您需要使用的属性。它可以是以下之一:
前两个是你感兴趣的。
编辑:更多信息:)
您可以通过使用各种帧索引重复调用上述函数来循环帧。
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)
【讨论】:
我认为您必须将整个文件读入 IplImages 数组,然后完成该操作。原因是,cvQueryFrame 是一个单向进程,它按顺序一次读取一帧。我想不出别的办法。根据视频的长度,初始化时间可能不会太长。
如你所说,cvTrackbars 主要用于更改参数。它们改变变量的值(以指针形式作为参数给出)并抛出一个回调函数。不幸的是,据我所知,它们是 HighGUI 中唯一的按钮样式元素
【讨论】:
对于 C++ 和 opencv3.4,frame_index 是您要寻找的位置。
Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;
【讨论】:
在highgui 库中,您会找到用于搜索栏的函数(cvCreateTrackbar 和朋友)。
【讨论】: