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

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

Recommended Posts

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

Такой вызов вдолжен выбросить диалог выбора камеры.

CvCapture* capture = cvCaptureFromCAM( -1 );

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


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

CvCapture* capture = cvCaptureFromCAM( -1 );

такой вызов выбрасывает только ошибку.

в файле помощи написано - CvCapture* cvCaptureFromCAM(int index) Initializes capturing a video from a camera.

Parameter: index – Index of the camera to be used. If there is only one camera or it does not matter what camera is used -1 may be passed.

но если поставить -1 то вылетит просто ошибка. Может есть еще какие нить способы как взять список камер?

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


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

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

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

Мне кажется, что при использовании камер фирмы Axis, лучше всего взять их SDK-шники и их уже развивать в том или ином направлении.

Например AXIS Camera Control SDK http://www.axis.com/techsup/software/acc/index.htm

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


Ссылка на сообщение
Поделиться на других сайтах
Например AXIS Camera Control SDK http://www.axis.com/techsup/software/acc/index.htm

Что собственно в 8 посте я и написал, только использовал не AXIS Camera Control SDK, а Axis Video Capture Driver.

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


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

Я бы попробовал открывать по очереди все камеры, до тех пор пока открываются. Как не открылась, так значит камеры кончились.))

int i=0;
CvCapture* cap;
while(cap=cvCaptureFromCAM(i++))
cvReleaseCapture(cap);[/codebox]

Как то так например. В i по хорошему должно остаться количество доступных камер.

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


Ссылка на сообщение
Поделиться на других сайтах
Я бы попробовал открывать по очереди все камеры, до тех пор пока открываются. Как не открылась, так значит камеры кончились.))

int i=0;
CvCapture* cap;
while(cap=cvCaptureFromCAM(i++))
cvReleaseCapture(cap);[/codebox]

Как то так например. В i по хорошему должно остаться количество доступных камер.

у меня этот кусок кода не работает. Биледру не нравиться cvReleaseCapture(cap);

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


Ссылка на сообщение
Поделиться на других сайтах
у меня этот кусок кода не работает. Биледру не нравиться cvReleaseCapture(cap);

Правильно, надо проверять чтобы cap было не NULL.

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


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

У него проверяется. Дело скорее в отсутствии символа & перед cap.

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


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

пробую изменить разрешение камеры

CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);

assert( capture );

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);

но это не срабатывает :(

Вопрос: OpenCV вообще позволяет устанавливать параметры видеопотока от камеры? и если нет, то как лучше это реализовать?

Спасибо!

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


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

У меня, например, параметры камеры устанавливаются Logitech-овской прогой в трее, через OpenCv не пробовал, и думаю что не получится :(, я постоянно использую максимальное разрешение, потом масштабирую (уменьшаю в основном):

cvResize(frame, frame_resized, CV_INTER_LINEAR);

где: frame - кадр с камеры, frame_resized - изображение нужного размера.

ЗЫ: мне кажется, что камера у Вас не поддерживает запрашиваемое разрешение (см. документацию).

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


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

У меня изменение ширины и высоты при помощи cvSetCaptureProperty работает. Другое дело, что оно работает немного странно. Дело в том, что при уменьшении разрешения должно расти количество картинок в секунду. Например при максимальном разрешении моя камера отдаёт только 15 картинок, а при половинном разрешении все 30. Но этого не происходит - картинка-то уменьшается, а вот скорость не растёт. Ну и не каждое разрешение можно установить, а только то, которое поддерживает камера.

Кроме того, ширина и высота - единственные параметры, которые можно установить. Было бы здорово, если бы с помощью cvSetCaptureProperty также можно было бы установить яркость, контраст и гамму (и в библиотеке константы уже приготовлены), но чтобы это реализовать надо глубоко покопаться в исходниках (вроде как VideoInput за это отвечает).

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


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

пробовал и ресайзить, но это ничего не даёт. Дело в том, что если запускаю камеру с дефолтным разрешением - она показывает чёрный экран. Сторонняя софтина начинает показывать картинку, только если уменьшить разрешение.

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


Ссылка на сообщение
Поделиться на других сайтах
пробовал и ресайзить, но это ничего не даёт. Дело в том, что если запускаю камеру с дефолтным разрешением - она показывает чёрный экран. Сторонняя софтина начинает показывать картинку, только если уменьшить разрешение.

OpenCv- шные примеры тоже выводят черный экран?

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


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

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

начал разбираться, как OpenCV работает с видеопотоком.

Т.к. на примере AMCap я вижу, что DirectShow работает с камерой нормально (пусть и не на максимальном разрешении)

Я так понимаю, что работа ведётся через VFW. Хотя какие-то наброски работы через DirectShow есть.

Возник вопрос - как подружить DirectShow и openCV ?

Толковых библиотек DirectShow пока не нашёл и пока пробую videoInput, но опять-таки безрезультатно :(

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


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

Какую версию OpenCV используешь?

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


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

Зайди в исходники OpenCV: в файле cvcap.cpp есть функция cvCreateCameraCapture. В ней используется захват с камеры через DirectShow, если определён макрос HAVE_VIDEOINPUT. У меня в версии 2.1 он определён. Попробуй в отладчике зайти в эту функцию и проверь: создаётся ли DirectShow-камера с помощью функции cvCreateCameraCapture_DShow.

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


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

Спасибо!

интересно - во второй версии точно так же. Причём, полез смотреть cvCreateCameraCapture_DShow, так она, в итоге, работает через ту же библиотеку videoInput :(

Но! Работать штатно не получается, а вот через внешнее прикручивание videoInput вроде бы что-то получилось.

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


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

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

...

Сделал все как по инструкции) Заработало!

Но обнаружился один МЕГА баг, в общем утечка памяти.

cvNamedWindow("1", 1);


CvCapture *capture = cvCaptureFromFile_FFMPEG("http://192.168.1.2/axis-cgi/mjpg/video.cgi?resolution=320x240&.mjpg");


while (true)

{

	if (cvWaitKey(10) == 27)

		break;


	IplImage *img = cvQueryFrame(capture);


	if (img == NULL)

		break;


	cvShowImage("1", img);

	// cvReleaseImage(&img); // если очищать то при следующем cvQueryFrame будет эксепшен, если не чищать то утечка будет расти((

}

Что делать, как исправлять?

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


Ссылка на сообщение
Поделиться на других сайтах
Сделал все как по инструкции) Заработало!

Но обнаружился один МЕГА баг, в общем утечка памяти.

cvNamedWindow("1", 1);


CvCapture *capture = cvCaptureFromFile_FFMPEG("http://192.168.1.2/axis-cgi/mjpg/video.cgi?resolution=320x240&.mjpg");


while (true)

{

	if (cvWaitKey(10) == 27)

		break;


	IplImage *img = cvQueryFrame(capture);


	if (img == NULL)

		break;


	cvShowImage("1", img);

	// cvReleaseImage(&img); // если очищать то при следующем cvQueryFrame будет эксепшен, если не чищать то утечка будет расти((

}

Что делать, как исправлять?

На первый взгляд ошибка в следующем:

Вынеси определение объекта IplImage *img; ДО цикла while.

В теле цикла просто:

img = cvQueryFrame(capture);

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


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

Вынеси определение объекта IplImage *img; ДО цикла while.

В теле цикла просто:

img = cvQueryFrame(capture);

Не помогло. Я даже делал циклический буфер, то есть что бы делать cvReleaseImage не сразу, а по прошествии некоторого времени, все равно ошибка вылетает.

Unhandled exception at 0x6d7a15be in ffmpegtest.exe: 0xC0000005: Access violation writing location 0x01141000.

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


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

Да, странно..

В данном случае cvReleaseImage вообще не нужен.

После цикла только cvReleaseCapture( &capture );

Ну и не забыть cvDestroyAllWindows();

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


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

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

У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на C# вот такой код:

Select all
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
using System;
...................
Capture capture = new Capture(); //create a camera capture[/codebox]

выдаёт Exception так как не определяет мою веб-камеру, но когда я взял у друга USB-веб-камеру то всё определилось и заработало. Я подумал что это именно с моя камера по каким-то причинам не определяется, но когда переслал этот код своей подруге с ноутбуком другой модели и встроенной вебкой то у неё тоже вылетело исключение. В общем у меня два вопроса:

1. У кого этот встроенная в ноут веб-камера определяется?

2. Почему у меня это происходит и что делать?

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


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

У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на C# вот такой код:

Select all
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
using System;
...................
Capture capture = new Capture(); //create a camera capture[/codebox]

выдаёт Exception так как не определяет мою веб-камеру, но когда я взял у друга USB-веб-камеру то всё определилось и заработало. Я подумал что это именно с моя камера по каким-то причинам не определяется, но когда переслал этот код своей подруге с ноутбуком другой модели и встроенной вебкой то у неё тоже вылетело исключение. В общем у меня два вопроса:

1. У кого этот встроенная в ноут веб-камера определяется?

2. Почему у меня это происходит и что делать?

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×