我一直在尝试使用OpenCV在C++中查找/实现查找和倒带功能(对于视频(.avi)),但我找不到一种方法,除了遍历整个文件一次并保存每个图像。还有别的办法吗?
如有任何帮助,我们将不胜感激;提前感谢!
发布于 2010-06-06 00:51:10
使用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和值。
bool VideoCapture::set(int property_id, double value)发布于 2010-06-04 22:02:44
我认为您必须将整个文件读入到一个IplImages数组中,然后完成该操作。原因是,cvQueryFrame是一个单向的过程,它按顺序一次读取一帧。我想不出其他的办法了。根据视频的长度,初始化时间可能不会太差。
如您所说,cvTrackbars主要用于修改参数。它们改变变量的值(以指针形式作为参数给出)并抛出一个回调函数。不幸的是,据我所知,它们是HighGUI中唯一的按钮样式元素
发布于 2018-07-30 12:56:31
对于C++和OpenV3.4,frame_index是您想要寻找的位置。
Mat frame;
VideoCapture capture("test.avi");
capture.set(CAP_PROP_POS_FRAMES, frame_index);
capture>>frame;https://stackoverflow.com/questions/2974625
复制相似问题