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

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

Recommended Posts

Попробуйте так: Capture capture = new Capture(0);

OpenCV-шные программы работают у меня на всех ноутах, включая EEE-PC.

Спасибо большое!!! Всё заработало!!!!! Интересно правда почему с обычной вебкой всё работало а со встроенной Capture(0) писать надо...

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


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

Добрый всем день. Пытаюсь делать чтоб была работа Open CV c Ip камерами. Вот в инструкции которая написана в данной теме не совсем понятно как сделать 4,5 и 6 пункт.

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

Вот.

Если не сложно опишите процесс более подробно.

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


Ссылка на сообщение
Поделиться на других сайтах
Добрый всем день. Пытаюсь делать чтоб была работа Open CV c Ip камерами. Вот в инструкции которая написана в данной теме не совсем понятно как сделать 4,5 и 6 пункт.

Если не сложно опишите процесс более подробно.

Это всё я писал для OpenCV 1.1, которую компилировал с помощью MSVS 2005. Сейчас у меня установлена OpenCV 2.1 и MSVS 2010. Там уже другие манипуляции нужны.

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


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

может если не сложно вы выложите свои перекомпилированные библиотеки

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


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

Да, чуть не забыл. При захвате из файла просто вызываешь cvCaptureFromAVI, а не cvCaptureFromFile_FFMPEG. Внутри этой функции ffmpeg автоматически будет выбираться.

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


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

Привет всем.

OpenCV поддерживает некоторые кодеки для записи AVI:

1 - CV_FOURCC('P','I','M','1') = MPEG-1 codec

2 - CV_FOURCC('M','J','P','G') = motion-jpeg codec

3 - CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

4 - CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

5 - CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

6 - CV_FOURCC('U', '2', '6', '3') = H263 codec

7 - CV_FOURCC('I', '2', '6', '3') = H263I codec

8 - CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

Вопрос:

Можно ли как-нибудь управлять битрейтом?

Это касается, в частности, кодеков 3, 4 и 5.

Из каких соображений выбираются значения битрейта "по умолчанию"?

Заранее спасибо!

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


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

В документации написано только про фреймрейт:

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1);

fps - и есть фреймрейт.

Чтобы запись шла правильно (реалтайм), нужно знать с какой скоростью просчитывается видео. Это можно измерить.

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

Я обычно указываю фреймрейт своей вэбки, большой ошибки не возникает.

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


Ссылка на сообщение
Поделиться на других сайтах
В документации написано только про фреймрейт:

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1);

fps - и есть фреймрейт.

Меня интересует именно БИТРЕЙТ, т.е. характерстика сжатия видео.

Задача получить AVI как можно меньшего размера при приемлемом качестве.

Причём всё должно быть автоматизировано.

Можно, конечно, сформировать несжатый AVI, а затем вызывать консольный VirtualDub или mencoder, но это громоздко, занимает много времени

и места на диске.

Хотелось бы решить задачу поизящнеее...

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


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

Битрейт никак не задать, просто не выведены интерфейсы. Если OpenCV скомпилирована по-умолчанию, то в качестве обёртки для компрессии и записи avi используется виндовская vfw. В этом случае выставляется: copts.dwQuality = 10000;, где copts - это AVICOMPRESSOPTIONS (см. файл ..OpenCV2.1\src\highgui\cvcap_vfw.cpp). Это значение для большинства (или для всех?) кодеков является значением битрейта.

Выхода два:

1. доработать OpenCV, сделать интерфейс для задания битрейта при записи в avi - это трудный путь;

2. исправить в исходниках приведённое мной значение по-умолчанию, перекомпилировать highgui.dll и пользоваться.

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


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

А можно ли с помощью Open CV получать какие то более человеческие имена камер нежели просто 0,1 ,2 , и тд. ? просто это не удобно в работе выбирая между 5 камерами если тебе известны тока номера. можноли получить имя камеры?

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


Ссылка на сообщение
Поделиться на других сайтах
Битрейт никак не задать, просто не выведены интерфейсы. Если OpenCV скомпилирована по-умолчанию, то в качестве обёртки для компрессии и записи avi используется виндовская vfw. В этом случае выставляется: copts.dwQuality = 10000;, где copts - это AVICOMPRESSOPTIONS (см. файл ..OpenCV2.1\src\highgui\cvcap_vfw.cpp). Это значение для большинства (или для всех?) кодеков является значением битрейта.

Выхода два:

1. доработать OpenCV, сделать интерфейс для задания битрейта при записи в avi - это трудный путь;

2. исправить в исходниках приведённое мной значение по-умолчанию, перекомпилировать highgui.dll и пользоваться.

Спасибо!

Буду копать идею № 2. Если чего добьюсь - отпишусь.

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


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

неужели все в программах так и пользуются номерами камер, 0,1,2...? Я думаю есть ведь какое то решение

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


Ссылка на сообщение
Поделиться на других сайтах
неужели все в программах так и пользуются номерами камер, 0,1,2...? Я думаю есть ведь какое то решение

Это скорее к MSDN чем к OpenCV.

Перечисляйте все девайсы, отлавливайте камеры, и выводите их имена.

Вот ссылка (первая на которую наткнулся): http://www.codeproject.com/KB/system/SimpleSetup.aspx

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


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

Онлайн трансляция с МКС: mms://a1709.l1856953708.c18569.g.lm.akamaistream.net/D/1709/18569/v0001/reflector:53708

Для любителей половить НЛО :)

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


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

Помогите пожалуйста разобраться, записываю поток в файл следующим алгоритмом в ос Linux (Ubuntu)

CvCapture *capture = cvCreateCameraCapture(0);

		assert(capture!=0);


			const char *filename = "capture.avi";



			double fps = 25;



			CvSize size = cvSize( (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));



			CvVideoWriter *writer = cvCreateVideoWriter(filename, CV_FOURCC('X','V','I','D'), fps, size, 1);

			assert(writer!=0);


			IplImage *frame=0;


			while(true){


					frame = cvQueryFrame( capture );



					cvWriteFrame(writer, frame);



				char c = cvWaitKey(1);

				 if (c == 27) {

						   break;

				   }

			}


			cvReleaseImage(&frame);

			cvReleaseCapture( &capture );

			cvReleaseVideoWriter(&writer);

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

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


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

Очевидно, что fps нельзя так просто брать и задавать значение 25. Камера захватывает с другой частотой, при записи в файл надо задавать такое же значение.

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


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

double fps = cvGetCaptureProperty (capture, CV_CAP_PROP_FPS);

однако появляется ошибка говорящая о том, что fps не может быть меньше 0.

Проблема решена методом ручного подбора значения.

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


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

Можно сначала собрать статистику по быстродействию программы (сотня-другая первых кадров).

// ставим в начале листинга

double t = (double)cvGetTickCount();

// Находим, сколько времени прошло с предыдущего кадра

// это вычисляется каждый цикл сбора статистики

t = (double)cvGetTickCount() - t;

printf("Frame time: %.2f millisec\n", t/(cvGetTickFrequency()*1000.));

// дальше усредняем

// Устанавливаем fps и работаем дальше

  • Like 1

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


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

для работы с камерами я нашел компонент TVideoGrabber. он работает как с usb так и с ip камерами. Жалко что платный. но работает отлично.

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


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

Скачал TVideoGrabber с таблеткой - очень серьезная штука - делает все.

Как я понял только стандартными средствами opencv делать все настройки драйвера источника - камеры, тв-карты или платы видеозахвата(разрешение, выбор источника с названием источника, яркость, контраст, гамма и все пр.) из под собственной проги нельзя. Требуется дополнительная прослойка. Из таких прослоек нашел два варианта: DSPack и TVideoGrabber. В них все это возможно.

Вопрос кто-нибуть состыковывал эти компоненты с opencv (передача видеопотока или изображений из одного в другой)? Это возможно? И если возможно, то нет-ли каких примеров. Заранее благодарен!

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


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

Состыковать с OPenCV смотри здесь. http://www.compvision.ru/forum/index.php?s...ic=280&st=0

Я не нашел докумнтации. что нужно я взял из примеров. там все вроде просто.

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


Ссылка на сообщение
Поделиться на других сайтах
Состыковать с OPenCV смотри здесь. http://www.compvision.ru/forum/index.php?s...ic=280&st=0

Я не нашел докумнтации. что нужно я взял из примеров. там все вроде просто.

Спасибо, я так понял это касается как TVideoGrabber, так и DSPack?

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


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

Здравствуйте! Не подскажите какую нибудб Online IP камеру, чтобы протестить собранную библиотеку opencv????

что то типа http://129.89.28.32/axis-cgi/mjpg/video.cgi?resolution=480X360.mjpg, но только работающее))

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


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

Здравствуйте! Не подскажите какую нибудь Online IP камеру, чтобы протестить собранную библиотеку opencv????

что то типа http://129.89.28.32/...on=480X360.mjpg, но только работающее))

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×