Невозможно прочитать кадры из 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

Вопросы:

  1. Я что-то пропустил?
  2. Есть ли что-нибудь еще, что я мог сделать?
  3. Есть ли хоть какой-нибудь способ, как получить дополнительную информацию о том, в чем на самом деле может быть проблема?

... 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-порт вашего компьютера напрямую.

Другие вопросы по тегам