Jump to content
Compvision.ru
RinOS

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

Recommended Posts

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

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

CvCapture* capture = cvCaptureFromCAM( -1 );

Share this post


Link to post
Share on other sites
Такой вызов вдолжен выбросить диалог выбора камеры.

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 то вылетит просто ошибка. Может есть еще какие нить способы как взять список камер?

Share this post


Link to post
Share on other sites
Видел в сети пример в котором показано как работать с 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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Я бы попробовал открывать по очереди все камеры, до тех пор пока открываются. Как не открылась, так значит камеры кончились.))

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

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

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

Share this post


Link to post
Share on other sites
у меня этот кусок кода не работает. Биледру не нравиться cvReleaseCapture(cap);

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

Share this post


Link to post
Share on other sites
Правильно, надо проверять чтобы cap было не NULL.

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

Share this post


Link to post
Share on other sites

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

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 вообще позволяет устанавливать параметры видеопотока от камеры? и если нет, то как лучше это реализовать?

Спасибо!

Share this post


Link to post
Share on other sites

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

cvResize(frame, frame_resized, CV_INTER_LINEAR);

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Спасибо!

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

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

Share this post


Link to post
Share on other sites
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 будет эксепшен, если не чищать то утечка будет расти((

}

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

Share this post


Link to post
Share on other sites
Сделал все как по инструкции) Заработало!

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

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);

Share this post


Link to post
Share on other sites
На первый взгляд ошибка в следующем:

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

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

img = cvQueryFrame(capture);

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

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

Share this post


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

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

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

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

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

Share this post


Link to post
Share on other sites

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

У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на 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. Почему у меня это происходит и что делать?

Share this post


Link to post
Share on other sites
Здравствуйте!

У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на 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.

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.

×