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.

Ответы на вопрос(2)

Ваш ответ на вопрос