我一直在尝试使用C ++中的OpenCV查找/实现搜索和回放功能(对于视频(.avi)),但我找不到一种方法,除了通过整个文件一次并保存每个图像。还有其他办法吗?
非常感谢任何帮助;提前谢谢!
答案 0 :(得分:41)
使用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)
答案 1 :(得分:1)
我认为你必须将整个文件读入一个IplImages数组,然后完成它。原因是,cvQueryFrame是一个单向进程,它按顺序一次读取一帧。我想不出任何其他方式。根据视频的长度,初始化时间可能不会太糟糕。
cvTrackbars就像你说的那样,主要用于改变参数。它们改变变量的值(作为指针形式的参数给出)并抛出一个回调函数。不幸的是,据我所知,它们是HighGUI中唯一的按钮式元素
答案 2 :(得分:1)
对于C ++和opencv3.4,frame_index是您要查找的位置。
Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;
答案 3 :(得分:0)
在highgui库中,您可以找到搜索栏的功能(cvCreateTrackbar和朋友)。