在一定条件下,我需要能够将视频后退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
中的许多帧?
答案 0 :(得分:1)
cvSetCaptureProperty
和CvCapture
和IplImage
来自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);
我还没有尝试过,但是我认为这是您最好的选择。我怀疑使用实时摄像机而不是文件,它是否可以正常工作。