VideoCapture на OpenCV автоматически обновляет кадр - PullRequest
4 голосов
/ 03 мая 2011

Я реализую алгоритм, который требует видеокадр с момента времени t, а другой - с момента времени t + 1. Увидеть несколько примеров это показалось очень простым. Я думал, что это будет работать отлично:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t
    cap >> img2; // instant t+1
    imshow(img1 == img2);
}

Но это не так, изображения были такими же, потому что отображаемое изображение (img1 == img2) было полностью белым, указывая значение 255 для каждого пикселя.

Я подумал, что, возможно, я не давал достаточно времени для камеры, чтобы захватить второй кадр, и я использовал тот же, который все еще был в буфере. То, что я сделал, было просто:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t

    // I added 2.5 seconds between the acquisition of each frame
    waitKey(2500); 

    cap >> img2; // instant t+1
    waitKey(2500);
    imshow(img1 == img2);
}

Это все еще не сработало. Просто чтобы быть уверенным, я добавил следующие строки кода:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t
    imshow("img1", img1);
    waitKey(2500); // I added 2.5 seconds between the acquisition of each frame

    cap >> img2; // instant t+1

    // Here I display both images after img2 is captured
    imshow("img2", img2);
    imshow("img1", img1);
    waitKey(2500);
    imshow(img1 == img2);
}

Когда я снова отобразил два изображения после захвата img1, оба изображения изменились! Я пытался использовать разные объекты VideoCapture для разных изображений, но это не имело никакого эффекта ...

Может кто-нибудь посоветовать мне, что я делаю не так?

Спасибо

Ренан

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

При вызове устройства захвата (в вашем случае используется оператор >>), OpenCV отправляет только ссылку на текущий кадр.Таким образом, img1 будет указывать на буфер кадра, а когда вы вызываете cap >> img2, оба изображения будут указывать на последний кадр.Единственный способ сохранить отдельные изображения - хранить их в отдельных матрицах (например, img1.copyTo(myFirstImg), myFirstImg = img1.clone() и т. Д.).

3 голосов
/ 04 мая 2011

Я исправил проблему, скопировав img1 и img2 во вспомогательные матрицы, чтобы они точно остались прежними. Кто-нибудь знает лучшее решение?

2 голосов
/ 08 декабря 2013

Вы можете работать с cap.grab () и cap.retrieve (img1,) дважды. Присмотритесь к документации на .grab и получите VideoCapture. здесь

1 голос
/ 22 июля 2014

Captures the frame from system camera using OpenCV

функция захвата (), используемая для захвата кадров с видео камеры в OpenCV

...