Невозможно прочитать кадры из VideoCapture со вторичной веб-камеры с OpenCV
Код:
Простой пример, который отлично работает с основной веб-камерой (устройство 0):
VideoCapture cap(0);
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
// retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
break;
}
// display it:
imshow("MyVideo", frame);
// check if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
// else continue:
}
cap.release();
Проблема:
У меня есть вторая веб-камера, которую я хотел бы использовать. Тем не менее, когда я заменяю VideoCapture cap(0);
с VideoCapture cap(1);
поток открывается правильно (или хотя бы cap.isOpened()
возвращается true
) но cap.read(frame)
возврат звонка false
и я не могу понять почему.
Что я пробовал:
Я пытался играть с
VideoCapture
Настройки немного похожи на звонки:cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
и случайные вещи, как это, но ничего не помогает.
Я также обнаружил, что: VideoCapture:: read не работает на несжатом видео (ошибка № 2281), которая, кажется, решается в версии 2.4.7... но я только что обновил OpenCV до 2.4.8, и он все еще не Работа...
Я пытался использовать AMCap для захвата сырого видео с этой камеры, сохранить его как
aaa.avi
файл и построенVideoCapture
по телефону:VideoCapture cap("aaa.avi");
и это работает (при чтении из файла)... мне нужна обработка в реальном времени с просмотром в реальном времени.
Детали HW, OS, SW:
Мой HW: HP ProBook 4510s со встроенной веб-камерой, которая всегда работает идеально
+ внешняя веб-камера CANYON CNR-FWCII3, называемая ОС "USB Video Device" (проблемная) ОС, SW: Windows 8.1 Pro x86, Visual Studio 2012 Pro, OpenCV 2.4.8 ~ с использованием сборки vc11
Вопросы:
- Я что-то пропустил?
- Есть ли что-нибудь еще, что я мог сделать?
- Есть ли хоть какой-нибудь способ, как получить дополнительную информацию о том, в чем на самом деле может быть проблема?
... API OpenCV в этом случае кажется довольно слабым, и везде, где люди, похоже, сталкивались с подобной проблемой, был кто-то, кто в качестве оправдания утверждал, что это "OS / HW depnendant".
Любая помощь будет оценена.
3 ответа
Через некоторое время я узнал, что это всегда только первый звонок read
Это не помогло, и пропуск первого кадра начал работать нормально, хотя истинная причина такого поведения осталась неизвестной.
Позже James Barnett (см. Комментарии выше) указал, что причина может заключаться в том, что для подготовки камеры к съемке требуется некоторое время, и мое текущее решение выглядит следующим образом (сон C++11):
#include <chrono>
#include <thread>
...
VideoCapture cap(1);
// give camera some extra time to get ready:
std::this_thread::sleep_for(std::chrono::milliseconds(200));
if (!cap.isOpened()) {
std::cout << "Unable to read stream from specified device." << std::endl;
return;
}
while (true)
{
// retrieve the frame:
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to retrieve frame from video stream." << std::endl;
continue;
}
// display it:
imshow("LiveStream", frame);
// stop if Esc has been pressed:
if (waitKey(1) == 27) {
break;
}
}
cap.release();
Надеюсь, некоторые будущие посетители найдут это полезным:)
Самый простой способ решить это прочитать один раз, прежде чем проверять на успех. Этот фрагмент кода работает для меня. //
cap.read(frame);
if(!cap.read(frame)){
//...
исправление в моем случае - отключить любую камеру, подключенную к вспомогательному концентратору! даже если только один! используйте USB-порт вашего компьютера напрямую.