Jump to content
Compvision.ru
RinOS

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

Добрый всем день. Пытаюсь делать чтоб была работа 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 с камерой нет.

Вот.

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Привет всем.

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.

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
В документации написано только про фреймрейт:

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Выхода два:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

Выхода два:

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

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

Спасибо!

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Помогите пожалуйста разобраться, записываю поток в файл следующим алгоритмом в ос 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);

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
я пробовал получать значение fps таким способом:

double fps = cvGetCaptureProperty (capture, CV_CAP_PROP_FPS);

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

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

Share this post


Link to post
Share on other sites
Проблема решена методом ручного подбора значения.

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

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

double t = (double)cvGetTickCount();

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

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

t = (double)cvGetTickCount() - t;

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
для работы с камерами я нашел компонент TVideoGrabber. он работает как с usb так и с ip камерами. Жалко что платный. но работает отлично.

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

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

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

Share this post


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

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

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

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.

×