OpenCV grab ничего не делает с веб-камерой
Я пытался одновременно захватывать кадры с двух разных камер, но независимо от того, сколько раз я вызываю VideoCapture :: grab (), похоже, это не дает никакого эффекта. Кадр, извлеченный с помощью VideoCapture :: retrieve (), всегда является первым кадром, полученным из последнего VideoCapture :: retrieve ().
Я протестировал его на OpenCV 2.4 и 3.1, с камерой Logitech C920 на Windows.
Пример:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //image with green sheet is retrieved
Sleep(100000); //change red sheet with blue sheet
vCapture.retrieve(imgResult); //red sheet is retrieved
Я также попробовал:
for(int i = 0; i < 1000; i++){
vCapture.grab();
} //takes almost no processing time, like an empty for
vCapture.retrieve(imgResult); //same as before
Retrieve всегда возвращает true и извлекает фрейм, даже если с момента открытия vCapture захват не был вызван.
Моим текущим решением было извлечение кадра дважды (многопоточность) для обеспечения последнего кадра, но оно недостаточно надежно для синхронизации обеих камер. Может кто-нибудь пролить свет на то, как заставить камеру захватывать текущий кадр?
Спасибо!
Редактировать:
Вариант первого примера, для ясности:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
vCapture.retrieve(imgResult); //image with green sheet is retrieved
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //green sheet is retrieved
vCapture.retrieve(imgResult); //red sheet is retrieved
Sleep(100000); //change red sheet with blue sheet
vCapture.retrieve(imgResult); //red sheet is retrieved
vCapture.retrieve(imgResult); //blue sheet is retrieved
Ожидаемое поведение:
VideoCapture vCapture;
Mat imgResult;
vCapture.open(0); //at this point, there is a green sheet in front of the camera
vCapture.retrieve(imgResult); //error or image with green sheet is retrieved
Sleep(100000); //change green sheet with red sheet
vCapture.grab(); //returns true
vCapture.retrieve(imgResult); //red sheet is retrieved
Согласно документации OpenCV:
VideoCapture::grab
: Методы / функции извлекают следующий кадр из видеофайла или камеры и возвращают true (не ноль) в случае успеха.
VideoCapture::retrieve
: Методы / функции декодируют и возвращают только что захваченный кадр. Если ни один кадр не был захвачен (камера была отключена или в видеофайле больше нет кадров), методы возвращают false, а функции возвращают указатель NULL.