是否可以倒带VideoCapture中的许多帧

时间:2019-01-24 03:38:53

标签: c++ opencv video-capture

在一定条件下,我需要能够将视频后退10帧。 到目前为止,我有一个VideoCapture cap,我从中提取要编辑的帧并用cap >> frame显示,其中frame的类型为Mat(这是我剩下的所有帧编辑内容建立。

我发现您可以使用

倒带帧
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );

但是问题是,这与我的VideoCapture cap不兼容,编译器说:

min.cpp:158:72: error: cannot convert ‘cv::VideoCapture’ to ‘CvCapture*’ for argument ‘1’ to ‘int cvSetCaptureProperty(CvCapture*, int, double)’
             cvSetCaptureProperty(cap,CV_CAP_PROP_POS_FRAMES, i-TRCK_MRG);
                                                                        ^
min.cpp:159:37: error: cannot convert ‘cv::VideoCapture’ to ‘CvCapture*’ for argument ‘1’ to ‘IplImage* cvQueryFrame(CvCapture*)’
             frame = cvQueryFrame(cap);

如果我使用VideoCapture *cap将帧捕获为IplImage* frame,则除非将帧转换回Mat类型,否则程序的其余部分也需要修改。

因此,是否可以倒退VideoCapture中的许多帧?

1 个答案:

答案 0 :(得分:1)

cvSetCapturePropertyCvCaptureIplImage来自C接口,该接口已不建议使用,除非绝对必要,否则不要使用。

不过,可以在C ++接口上使用相同的功能,更确切地说是this one。代码类似于:

cv::VideoCapture cap("moviefile.mp4");

// read 200 frames
for (int i =0; i < 200; ++i)
 cap.read();

// get the current position
auto pos = cap.get(cv::CV_CAP_PROP_POS_FRAMES);
// set the new position
cap.set(cv::CV_CAP_PROP_POS_FRAMES, pos-10);

我还没有尝试过,但是我认为这是您最好的选择。我怀疑使用实时摄像机而不是文件,它是否可以正常工作。