Самый быстрый способ получить кадры с веб-камеры
У меня возникла небольшая проблема с разработкой одной из моих программ на C++ (Visual Studio). Сейчас я пытаюсь подключить несколько веб-камер (подключенных через USB-кабели), создавая для каждой из них отдельный поток для захвата кадров и отдельный кадр. для обработки изображения.
Я использую OpenCV для обработки кадров, но проблема в том, что я не получаю пика возможностей веб-камеры (она поддерживает 25 кадров в секунду, я получаю только 18), есть ли какая-то библиотека, которую я мог бы использовать для получения кадров, чем обрабатывать их с помощью OpenCV, которая бы заставили кадры быть захвачены быстрее?
Я немного исследовал, и самый популярный способ - использовать directshow для получения фреймов и OpenCV для их обработки.
Ты согласен? Или у вас есть другое решение? Я бы не обиделся на некоторые ссылки:)
2 ответа
DirectShow используется только в том случае, если вы открываете свой захват с помощью флага CV_CAP_DSHOW, например:
VideoCapture capture( CV_CAP_DSHOW + 0 ); // 0,1,2, your cam id there
(без него по умолчанию vfw)
Захват уже выполняется в отдельном потоке, поэтому добавление в него большего количества потоков не принесет вам никакой выгоды.
Еще одно препятствие с несколькими камерами - пропускная способность USB, поэтому, если у вас есть порты на задней и передней панели компьютера, не подключайте все свои кулачки к одному порту / контроллеру, иначе вы просто насытите его.
OpenCV использует DirectShow. Прямое использование DirectShow (основной API для захвата видео в Windows), очевидно, обеспечит вам нормальную или более высокую производительность (и даже более вероятно, если OpenCV будет использовать Video for Windows). USB-камеры обычно достигают полосы пропускания USB и, следовательно, ограничения частоты кадров, использование DirectShow для захвата в сжатых форматах или в форматах с меньшим количеством бит / пиксель является способом достижения более высокой частоты кадров в пределах того же ограничения полосы пропускания USB.
Другой типичной проблемой, вызывающей низкие частоты кадров, является медленная синхронная обработка, задерживающая захват. Обычно это можно определить, поместив тривиальную обработку в один и тот же цикл захвата и увидев более высокий FPS по сравнению с операцией с включенной обработкой.