Randel 0 Жалоба Опубликовано November 13, 2013 Добрый день! В программе необходимо работать с кадрами, получаемыми с разных 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, как я понимаю, не имеет возможности постановки захвата на "паузу". Там нужно останавливать и перезапускать поток. А это очень долго. Как быть? Как организовать такой вот захват с нескольких камер? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано November 13, 2013 Задача не такая уж и простая. Я бы для каждой камеры создал отдельный поток захвата, а также отдельную очередь с потокобезопасной возможностью чтения и удаления кадра с начала и добавления в конец очереди. Также для очереди надо сделать возможность задания максимального размера, чтобы в случае сильной загрузки системы можно было сбрасывать кадры. В качестве затравки можешь поискать статьи и имплементации thread safe lock free алгоритмов и контейнеров. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Randel 0 Жалоба Опубликовано November 13, 2013 Я бы для каждой камеры создал отдельный поток захвата, а также отдельную очередь с потокобезопасной возможностью чтения и удаления кадра с начала и добавления в конец очереди. Также для очереди надо сделать возможность задания максимального размера, чтобы в случае сильной загрузки системы можно было сбрасывать кадры. Полностью согласен! И я бы сделал также. К сожалению, я не настолько силен в программировании, чтобы за обозримый срок написать такой обработчик самостоятельно с нуля. Но я уверен, что несмотря на сложность, задача то должна быть популярной. В той же робототехнике и т.п. Я думал, что уже есть готовые библиотеки, реализующие эти процедуры. Честно говоря, надеялся на opencv . Она же, вроде как, декларирует поддержку нескольких камер. Даже, помню, хелп такой читал...Я думал, что тот же VideoCapture реализует захват в отдельном потоке. Раз есть примеры его использования для стереокамер. Пробовал получать jpeg`и через http, но это получается очень медленно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано November 14, 2013 Ну вот тут вроде решили эту проблему используя boost'овые треды. 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
iskees 32 Жалоба Опубликовано November 14, 2013 Есть еще один аспект в работе с IP камера, в новых процах интел начиная с иви бридж кажется появилась технология intel quick sync-аппаратное декодирование видео, а с ip камер видео как раз нужно декодировать причем на лету. Разница между процессором с intel quick sync и без него огромная, без этой технологии проц просто на получении видео грузится на 30%,а с ней на 2-5%. Применительно к C# для работы с IP камерами я использую AForge, работает со всеми камерами, получение в отдельном потоке правда возвращает битмапы но opencv без проблем их коверетирует, возможно и на C++ он есть. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано November 14, 2013 Ну, аппаратное декодирование jpeg и h.264 есть сейчас уже на всех видеоадаптерах. Например, на Радеонах называеся UVD. Нвиди предоставляет примеры на CUDA, как это делать. Проблема в том, что при большом числе видеопотоков надо будет вручную производить балансировку нагрузки между устройствами декодирования. Каким-нибудь видеоплейерам в этом случае гораааздо легче. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Randel 0 Жалоба Опубликовано November 16, 2013 Ну вот тут вроде решили эту проблему используя boost'овые треды. Спасибо большое за ссылку и за обсуждение! В результате танцев с бубном, cvWaitKey(), gpu и прочих извращений на основании данного примера цель была условно достигнута. С шести камер (больше в свиче мест нет) идет параллельный захват. Кадров 20 в секунду с каждой есть точно, а большего и не нужно. Я, честно говоря, и не ожидал такого результата. Надеялся на 6-10. Интересно, но, судя по диспетчеру задач, загрузка процессора ~5-6%. Причем, что в отдельном потоке еще и нехитрая обработка идет. Так что boost+opencv это реально быстро Правда, работает все это дело только с камерами в локальной сети. Когда пытаешься использовать какие-нибудь далекие вебки (больше двух штук), то обязательно получаешь исключение в cvQueryFrame, типа "mjpeg overread", "frame bad header". Короче говоря, как я понимаю, битый фрейм приходит. Как это предупредить и обработать я пока не понял...Нужно как-то дропнуть кадр не пытаясь его прочитать. Так что пока работа продолжается, но в общем-то дело с мертвой точки сдвинулось. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 16, 2013 Есть проект с открытым кодом (на action script и java под линукс) http://bigbluebutton.org/ (большой правда, но при желании из него можно достать полезные вещи). Я через эту систему лекции читаю, 12 камер в реалтайме через VPN идет вполне хорошо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано November 17, 2013 Мы в системах видеонаблюдения десятки камер в реалтайме обрабатывали, сохраняли в архив и выводили. Но это путь корпораций: всё вручну, где-то библиотеки от вендоров и т.п. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах