есть ли возможность перемотать несколько кадров в VideoCapture - PullRequest
0 голосов
/ 24 января 2019

При определенных условиях мне нужно иметь возможность перематывать видео на 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 голосов
/ 24 января 2019

cvSetCaptureProperty и CvCapture и IplImage взяты из интерфейса C, который устарел и не должен использоваться, если это не является строго необходимым.

Однако вы можете использовать ту же функцию с интерфейсом C ++, если быть более точным, это эта . Код будет выглядеть примерно так:

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);

Я еще не пробовал это, но я думаю, что ваш лучший выстрел. С живой камерой вместо файла я сомневаюсь, что она вообще будет работать.

...