Перейти к содержимому
Compvision.ru
Randel

Захват с нескольких камер

Recommended Posts

Добрый день!

В программе необходимо работать с кадрами, получаемыми с разных ip камер. Если использовать класс VideoCapture и расширить "канонический" пример:

#include "opencv2/opencv.hpp"


using namespace cv;


int main(int, char**)

{

    VideoCapture cap1("ip-address1"); // open the 1. camera

    VideoCapture cap2("ip-address2"); // open the 2. camera


    if(!cap1.isOpened()||!cap2.isOpened())  // check if we succeeded

        return -1;


    namedWindow("frame1",1);

    namedWindow("frame2",1);

    for(;

    {

        Mat frame1, frame2;

        cap1 >> frame1; // get a new frame from camera

        cap2 >> frame2; // get a new frame from camera


        imshow("frame1", frame1);

        imshow("frame2", frame2);

        if(waitKey(30) >= 0) break;

    }

    // the camera will be deinitialized automatically in VideoCapture destructor

    return 0;

}[/code]

То в случае двух камер, приложение еще будет работать, а вот если число камер 3-4 (а вообще-то нужно 10), то через некоторое время программа виснет.

Виснет, как я понимаю из-за того, что просто не успевает обрабатывать такой объем данных. Как можно выйти из положения?

Первое, что мне пришло на ум - использовать фирменное SDK (в моем случае axis). Там можно ставить потоки на паузу и с помощью этого опрашивать камеры в цикле. Постоянно запуская только один поток. Решение медленное (с 10 камер где-то 3-4 кадра в секунду), но хотя бы рабочее.

Но хотелось бы уйти от фирменного SDK и получать фреймы сразу в формате OpenCV. VideoCapture, как я понимаю, не имеет возможности постановки захвата на "паузу". Там нужно останавливать и перезапускать поток. А это очень долго.

Как быть? Как организовать такой вот захват с нескольких камер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Задача не такая уж и простая.

Я бы для каждой камеры создал отдельный поток захвата, а также отдельную очередь с потокобезопасной возможностью чтения и удаления кадра с начала и добавления в конец очереди. Также для очереди надо сделать возможность задания максимального размера, чтобы в случае сильной загрузки системы можно было сбрасывать кадры.

В качестве затравки можешь поискать статьи и имплементации thread safe lock free алгоритмов и контейнеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я бы для каждой камеры создал отдельный поток захвата, а также отдельную очередь с потокобезопасной возможностью чтения и удаления кадра с начала и добавления в конец очереди. Также для очереди надо сделать возможность задания максимального размера, чтобы в случае сильной загрузки системы можно было сбрасывать кадры.

Полностью согласен! И я бы сделал также. К сожалению, я не настолько силен в программировании, чтобы за обозримый срок написать такой обработчик самостоятельно с нуля. Но я уверен, что несмотря на сложность, задача то должна быть популярной. В той же робототехнике и т.п. Я думал, что уже есть готовые библиотеки, реализующие эти процедуры. Честно говоря, надеялся на opencv :). Она же, вроде как, декларирует поддержку нескольких камер. Даже, помню, хелп такой читал...Я думал, что тот же VideoCapture реализует захват в отдельном потоке. Раз есть примеры его использования для стереокамер. Пробовал получать jpeg`и через http, но это получается очень медленно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот тут вроде решили эту проблему используя boost'овые треды.

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть еще один аспект в работе с IP камера, в новых процах интел начиная с иви бридж кажется появилась технология intel quick sync-аппаратное декодирование видео, а с ip камер видео как раз нужно декодировать причем на лету. Разница между процессором с intel quick sync и без него огромная, без этой технологии проц просто на получении видео грузится на 30%,а с ней на 2-5%. Применительно к C# для работы с IP камерами я использую AForge, работает со всеми камерами, получение в отдельном потоке правда возвращает битмапы но opencv без проблем их коверетирует, возможно и на C++ он есть.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, аппаратное декодирование jpeg и h.264 есть сейчас уже на всех видеоадаптерах. Например, на Радеонах называеся UVD. Нвиди предоставляет примеры на CUDA, как это делать. Проблема в том, что при большом числе видеопотоков надо будет вручную производить балансировку нагрузки между устройствами декодирования. Каким-нибудь видеоплейерам в этом случае гораааздо легче.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот тут вроде решили эту проблему используя boost'овые треды.

Спасибо большое за ссылку и за обсуждение!

В результате танцев с бубном, cvWaitKey(), gpu и прочих извращений на основании данного примера цель была условно достигнута. С шести камер (больше в свиче мест нет) идет параллельный захват. Кадров 20 в секунду с каждой есть точно, а большего и не нужно. Я, честно говоря, и не ожидал такого результата. Надеялся на 6-10. Интересно, но, судя по диспетчеру задач, загрузка процессора ~5-6%. Причем, что в отдельном потоке еще и нехитрая обработка идет. Так что boost+opencv это реально быстро :)

Правда, работает все это дело только с камерами в локальной сети. Когда пытаешься использовать какие-нибудь далекие вебки (больше двух штук), то обязательно получаешь исключение в cvQueryFrame, типа "mjpeg overread", "frame bad header". Короче говоря, как я понимаю, битый фрейм приходит. Как это предупредить и обработать я пока не понял...Нужно как-то дропнуть кадр не пытаясь его прочитать. Так что пока работа продолжается, но в общем-то дело с мертвой точки сдвинулось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть проект с открытым кодом (на action script и java под линукс) http://bigbluebutton.org/ (большой правда, но при желании из него можно достать полезные вещи). Я через эту систему лекции читаю, 12 камер в реалтайме через VPN идет вполне хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мы в системах видеонаблюдения десятки камер в реалтайме обрабатывали, сохраняли в архив и выводили. Но это путь корпораций: всё вручну, где-то библиотеки от вендоров и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×