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

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

Recommended Posts

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

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

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

  • Like 1

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


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

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

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


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

На сайтах пишут что нужно перекомпилировать с 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");

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


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

Закомментировал в коде #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

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


Ссылка на сообщение
Поделиться на других сайтах
Линкер начал писать [Linker Error] Error: Unresolved external 'cvCreateFileCapture_FFMPEG(const char *)' referenced from C:\URL CAM\UNIT1.OBJ
О, до ошибки линкера ты уже дошёл! В OpenCV 2.0 уже есть libopencv_ffmpeg200.dll.

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


Ссылка на сообщение
Поделиться на других сайтах
Вот сдесь: 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 дают надежду на компиляцию под Виндой.

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

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


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

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

С помощью 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

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


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

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

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


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

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

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

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

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


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

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 с камерой нет.

Вот.

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


Ссылка на сообщение
Поделиться на других сайтах
9. Все твои url с камерой нет.

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

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

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


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

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


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

Вот так получаю 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;

	}

}

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


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

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

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

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

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


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

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

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


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

Всем привет!

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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


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

Могу только направить вас сюда: http://opencv.willowgarage.com/wiki/faq#Ho...ithcvCamlibrary

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


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

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

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

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


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

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

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

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


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

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

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

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

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

Capture = cvCaptureFromCAM(0);

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

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


Ссылка на сообщение
Поделиться на других сайтах
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 но это думаю происходит из-за недо статочного канала связи

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×