Jump to content
Compvision.ru
RinOS

Работа с камерами

Recommended Posts

Видел в сети пример в котором показано как работать с IP камерой OpenCV и IP Axis, пример на С# c оберткой EMGU CV.

Кто ни будь пытался работать с IP камерами на С++?

Вот ссылка на ней можно по эксперементировать) http://webcam.oii.ox.ac.uk/mjpg/video.mjpg

  • Like 1

Share this post


Link to post
Share on other sites
Кто ни будь пытался работать с IP камерами на С++?

В OpenCV 1.1 есть cvCreateFileCapture_FFMPEG в _highgui.h, но он там закомментирован. Надо раскомментировать, перекомпилилировать highgui.dll. Посмотреть на ошибки линкера и попробовать с ними разобраться. У меня пока нет времени на это, может быть вечером.

Share this post


Link to post
Share on other sites

На сайтах пишут что нужно перекомпилировать с FFMPEG...

OpenCV can be compiled with FFMPEG support. From ./configure --help:

--with-ffmpeg use ffmpeg libraries (see LICENSE) [automatic]

You can then use *cvCreateFileCapture_FFMPEG* to create a CvCapture with e.g. the URL of the camera's MJPG stream.

I use this to grab frames from an AXIS camera:

CvCapture *capture = cvCreateFileCapture_FFMPEG("http://axis-cam/video.mjpg");

Share this post


Link to post
Share on other sites

Закомментировал в коде #ifdef HAVE_FFMPEG

#ifdef HAVE_FFMPEG

CvCapture* cvCreateFileCapture_FFMPEG (const char* filename);


CvVideoWriter* cvCreateVideoWriter_FFMPEG ( const char* filename, int fourcc, 

  double fps, CvSize frameSize, int is_color );

#endif

Линкер начал писать [Linker Error] Error: Unresolved external 'cvCreateFileCapture_FFMPEG(const char *)' referenced from C:\URL CAM\UNIT1.OBJ

Share this post


Link to post
Share on other sites
Линкер начал писать [Linker Error] Error: Unresolved external 'cvCreateFileCapture_FFMPEG(const char *)' referenced from C:\URL CAM\UNIT1.OBJ
О, до ошибки линкера ты уже дошёл! В OpenCV 2.0 уже есть libopencv_ffmpeg200.dll.

Share this post


Link to post
Share on other sites
Вот сдесь: http://www.rainsoft.de/projects/ffmpeg_opencv.html пишут как включить поддержку FFMPEG в OpenCV, но под линукс(

Угу. В папке otherlibs есть проект ffopencv, который и выдаёт необходимую ffopencv110.dll, в которой и есть интересующая функция cvCaptureFromFile_FFMPEG. Только для успешной компиляции надо скачать исходники ffmpeg, скомпилировать и получить либы: libavformat.a, libavcodec.a, libavutil.a, libgcc.a, libmingwex.a. Это линуксовые аналоги lib-файлов. Однако макросы _MSC_VER в ffopencv.cpp дают надежду на компиляцию под Виндой.

Мне, если честно, неохота возиться с этим делом. Если будешь пробовать - расскажи о результатах.

Share this post


Link to post
Share on other sites

В общем один из вариантов, получения видео такой:

С помощью DirectShow, исключительно для камер Axis для других не пробывал.

Скачиваем и устанавниваем Axis Video Capture Driver, в GraphEdit добавляем Axis MJPEG Capture Filter

d7d81db7b820.gif

и выстраиваем следующую схему:

5e0e0f91ee03.gif

После настраиваем Axis MJPEG Capture Filter:

d910526701db.gif

Проблема в том что я незнаю, как эту схему повторить для OpenCV, что бы просто работать с CvCapture, или хотя бы получать изображения как очередь IplImage.

К тому же выходное видео имеет формат ASF. Что усложняет задачу.

Другой способ более универсальный заключается в том что получать изображения в jpg, уж это умеют делать все камеры :)

http://webcam.oii.ox.ac.uk/jpg/image.jpg

Т.к. с C++ я пока на Вы, подскажите пожалуйста как просто получить файл по HTTP. Можно примерчик)

  • Like 1

Share this post


Link to post
Share on other sites

Через жесткий диск обмен это долго) Можно к примеру загрузить в буфер, но вот проблема как из буфера в IplImage )?

Share this post


Link to post
Share on other sites
Через жесткий диск обмен это долго) Можно к примеру загрузить в буфер, но вот проблема как из буфера в IplImage )?

Просто дать указатель на буфер (если принимаем IplImage или что то совместимое с ним) как здесь:

http://www.compvision.ru/forum/index.php?showtopic=121

А вообще мне кажется что Вам лучше UDP протокол использовать (если я правильно понял, что это типа Ip-телефонии будет) в билдере этим компонент NMUDP занимается.

Share this post


Link to post
Share on other sites

1. Скачал ffmpeg.

2. Поправил в ffopencv.cpp подключаемые либы на те, которые есть в скачанной ffmpeg.

3. В cvcap_ffmpeg.cpp исправил название функции с cvCreateFileCapture_FFMPEG на cvCaptureFromFile_FFMPEG.

4. В свойствах проекта ffopencv -> C|C++ -> Preprocessor -> Preprocessor Definitions добавил HAVE_FFMPEG и HAVE_FFMPEG_SWSCALE

5. Скомпилировал ffopencv

6. Перекомпилировал проект highgui

7. В своём проекте добавил инклуды ffopencv.h и _highgui.h, а также ffopencv.lib

8. Вызываю CvCapture *capture = cvCaptureFromFile_FFMPEG("c:\\video\\The Big Bang Theory (Season 3)\\the.big.bang.theory.s03e06.720p.hdtv.x264-ctu.mkv"); - проигрывается!

9. Все твои url с камерой нет.

Вот.

Share this post


Link to post
Share on other sites
9. Все твои url с камерой нет.

Возможно что то не так сделал... или у автора статьи OpenCV и IP Axis, по другому сделано.

В общем я подумаю над этим)

Share this post


Link to post
Share on other sites
Возможно что то не так сделал... или у автора статьи OpenCV и IP Axis, по другому сделано.
Скорее всего так и есть, а может у меня дома интернет-канал слишком узкий. На работе запустил из командной строки ffplay.exe "http://webcam.oii.ox.ac.uk/mjpg/video.mjpg" - показывает. ffplay.exe скачал с того же сайта, той же версии, которую подключал к OpenCV. Все исходники остались дома - попробовать на работе свой вариант смогу только в понедельник.

Share this post


Link to post
Share on other sites

Вот так получаю jpg с IP камеры

#include <urlmon.h>

#include <wininet.h>


IplImage* QueryFrame(char *sourceurl, AnsiString path)

{

	try

	{

		DeleteUrlCacheEntry(PChar(sourceurl));

		if (image)

			cvReleaseImage(&image);


		char* dstfile = AnsiString(path).c_str();


		if (!(URLDownloadToFile(NULL, sourceurl, dstfile, 0, NULL) == S_OK))

			return 0;


		image = cvLoadImage(dstfile, 1);

		return image;

	}

	catch (...)

	{

		return 0;

	}

}

Share this post


Link to post
Share on other sites

Здравствуйте!

Имеется USB веб-камера Logitech (p/n: 861206-0000, m/n: v-uas14). Через программу с диска, идущего в комплекте, работает как положено. При попытке получить изображние с камеры средствами OpenCV, возникает проблема: изображение почти полностью темное, за икслючением только сильно освещенных областей. Пробовали на 2х одинаковых камерах, результат тот же. Пробовали все режимы работы с камерой в cvCreateCameraCapture. Третья камера, уже другого производителя, работает отлично.

Подскажите, что это может быть: деффект камеры, драйверов, OpenCV не поддерживает устройство (довольно старая камера) или это типичная ошибка в настройках?

Share this post


Link to post
Share on other sites

Вроде как OpenCV работает с камерой через DirectShow. Можно попробовать посмотреть изображение с камеры через graphedit и поиграть с настройками. Если получится получить нормальный видеопоток, то разбираться с OpenCV, иначе проблему следует искать в драйверах.

Share this post


Link to post
Share on other sites

Всем привет!

Прошу помощи в следующем вопросе.

в процессе разработки отлаживался на компьютере с одной камерой все работало.

подключение камеры было функцией

m_Camera = cvCreateCameraCapture(0);

думал что когда будут еще камеры нужно будет заменить идентификатор на 1 или 2 и так далее

в зависимости от количесва камер и все будет работать.

Но когда появилась еще камера оказалось что я ошибался.

тоесть нужно например на компьютере 2 камеры нужно что бы в одной программе было видео с одной камеры

а в другой программе видео с другой камеры.

пробовал написать тестовый пример


int i = -1;
while(i++)
{
m_Camera = cvCreateCameraCapture(i);

if (m_Camera)
{
//выводим идентификатор
}

if (i == 10000)
{
break;
}
}
[/codebox]

но он всегда выдет 0 даже если подключено 2 камеры

драйвера для камер стоят. в других программах видео видется с обоих.

в директории с программой лежат файлы

highgui100.dll

cxcore100.dll

libguide40.dll

что упустил или чего не дочитал?

может что еще положить надо ?

и есть еще одна проблема.

скопировал программу на ноутбук

там стоит встроенная камера sony visual communication camera vgp-vcc6

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

все функции получения фрейма отрабатывают корректно. и возвражают уже черную картинку.

Share this post


Link to post
Share on other sites

Сейчас тоже пишу программу для нескольких камер и тестировал только с одной камерой.

попробуйте захват делать в отдельных трэдах на каждую камеру, я именно так собирался делать

Share this post


Link to post
Share on other sites
Сейчас тоже пишу программу для нескольких камер и тестировал только с одной камерой.

попробуйте захват делать в отдельных трэдах на каждую камеру, я именно так собирался делать

так если в разных тредах делать захваты то суть проблемы от этого не изменится.

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

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

а у меня этого непроисходит. идентификторв сегда один. и выхватывает всегда одну камеру до других я не могу достучаться.

Share this post


Link to post
Share on other sites

OpenCV 1.0 не поддерживает работу с несколькими камерами - сами разработчики на конференции Graphicon 2007 об этом говорили.

Попробуй более новую версию библиотеки, возможно, что всё изменилось к лучшему.

Share this post


Link to post
Share on other sites
OpenCV 1.0 не поддерживает работу с несколькими камерами - сами разработчики на конференции Graphicon 2007 об этом говорили.

Попробуй более новую версию библиотеки, возможно, что всё изменилось к лучшему.

Всем огромное спасибо за ответы. Nuzhny прав. пересобрав все под OpenCV 2.0 все заработало. и выбор камеры можно осуществлять как я и думал подбором id. но это решение работает не всегда тоесть время от времени появляются сбои вида. есть две программы одна работает с одной камерой другая с другой. одна с идентификатором 0 другая 1. бывает что запустишь программу и та которая была с идентификатором 1 запускает программу как будто это идентификатор 0. Буду пробовать решение которое предложил Smorodov. непосредственно с функциями для работы несколькими камерами. Еще раз всем спасибо за помощь.

Share this post


Link to post
Share on other sites

О сколько нам отрытий чудных...

Совершенно случайно вместо cvCreateCameraCapture использовал cvCaptureFromCAM. И мне выдалось сообщение типа Axis Video not initialisation. И тут меня осенило :)

В общем полез в GraphEdit настраивать "Axis Video Capture Driver", соединение с камерой Axis.

И к моему глубочайшему удивлению мне удалось соедениться с камерой, вот так:

Capture = cvCaptureFromCAM(0);

Вот только возник другой вопрос, где храняться настройки и можно ли как то использовать больше одной камеры...

Share this post


Link to post
Share on other sites
1. Скачал ffmpeg.

2. Поправил в ffopencv.cpp подключаемые либы на те, которые есть в скачанной ffmpeg.

3. В cvcap_ffmpeg.cpp исправил название функции с cvCreateFileCapture_FFMPEG на cvCaptureFromFile_FFMPEG.

4. В свойствах проекта ffopencv -> C|C++ -> Preprocessor -> Preprocessor Definitions добавил HAVE_FFMPEG и HAVE_FFMPEG_SWSCALE

5. Скомпилировал ffopencv

6. Перекомпилировал проект highgui

7. В своём проекте добавил инклуды ffopencv.h и _highgui.h, а также ffopencv.lib

8. Вызываю CvCapture *capture = cvCaptureFromFile_FFMPEG("c:\\video\\The Big Bang Theory (Season 3)\\the.big.bang.theory.s03e06.720p.hdtv.x264-ctu.mkv"); - проигрывается!

9. Все твои url с камерой нет.

Вот.

нужно тоже было получить изображение с IP Camera. Мысли совпали и делал примерно так же как описал Nuzhny

мометы которые были выявленны может комуто понадобится.Так как на момент написания камеры небыло тренировался на интернет ссылках с камер Аксис и Планет и с прочих других работающих по протоколу мжпег.

*важно что бы связь с инетом была очень хорошая и позволяла смотреть запись в реальном

*работа функции очень добгая уходит от 5 до 15 секунд что бы cvCreateFileCapture_FFMPEG подключилась к видео потоку

*работает не со всеми ссылками это действительно так чаще всего это происходит если ссылка заканчиваетя на cgi или .mjpeg?compression=60 или прочие параметры, но это лечится простым дописыванием необходимого расширения например http://site/xxx/xxx/video.cgi?.mjpg или http://site/xxx/xxx/.mjpeg?compression=60&.mjpg и большенство ссылок становятся съедобными

*время от времени происходит зависание видео и приходится перезапускать функцию cvCreateFileCapture_FFMPEG но это думаю происходит из-за недо статочного канала связи

Share this post


Link to post
Share on other sites

Добрый вечер. Подскажите пожалуйста, как мне получить список веб камер, чтоб была возможность выбрать одну из работающих в системе?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×