Jump to content
Compvision.ru
RinOS

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

Recommended Posts

Nuzhny

Спасибо.

После добавления cvWaitKey(1) в бесконечный цикл всё заработало.

Share this post


Link to post
Share on other sites

Ещё вопрос: как в OpenCV узнать все режимы работы камеры?

Т.е. как для объекта CvCapture получить список доступных разрешений?

Share this post


Link to post
Share on other sites

Пишу "на ощупь":

capture=highgui.cvCreateFileCapture('rtsp://192.168.1.4:554/ipcam.sdp')
Создает какую-то capture.
fr=highgui.cvQueryFrame(capture)

highgui.cvShowImage('film',fr)

highgui.cvWaitKey(0)

ничего не выдает

Share this post


Link to post
Share on other sites

Ой! заметила, что начинает выдавать картинку кадра после 10го. Включила видео

while 1:

      fr=highgui.cvQueryFrame(capture)

      highgui.cvShowImage('film',fr)

      highgui.cvWaitKey(1)

видна где-то секундная задержка(серый фон), дальше видео.

это особенности камеры или скорость инета? адаптация?

Share this post


Link to post
Share on other sites

Добрый день!

Написал программу, которая захватывает кадры с web-камеры и выводит их на pictureBox.

До этого работал с Matlab и там, видео с композитного входа тв-тюнера отражалось также как и видео с камеры. Но в OpenCV так не срабатывает. Например вот эта программа:

#include "stdafx.h"

#include "opencv/highgui.h"


CvCapture* capture;


int _tmain(int argc, _TCHAR* argv[])

{

	cvNamedWindow( "Example", CV_WINDOW_AUTOSIZE );



		capture = cvCaptureFromCAM(0);


	if( capture != NULL ){


		IplImage* frame;

		while(1) {

			frame = cvQueryFrame( capture );

			if( !frame ) break;

			cvShowImage( "Example", frame );

			char c = cvWaitKey(33);

			if( c == 27 ) break;

		}

		cvReleaseCapture( &capture );

		cvDestroyWindow( "Example" );

	};

	return 0;

}

создает окно Example, т.е. по сути имеет доступ у видео-потоку, но не выводит этот пресловутый поток в окно Example.

Кто-нибудь сталкивался с получением видео-данных с web-камеры?

Share this post


Link to post
Share on other sites

1. capture создаётся?

2. Если у тебя тюнер и web-камера, то попробуй разные индексы в cvCaptureFromCAM.

3. Может, твоя камера поддерживает только какие-то экзотические цветовые пространства? Я бы прошёл в отладчике все внутренности cvCaptureFromCAM.

Share this post


Link to post
Share on other sites

Сейчас набросал тестовую программку, чтобы посмотреть содержимое CvCapture *capture.

#include "stdafx.h"

#include "conio.h"

#include "opencv/highgui.h"

#include "iostream"


using namespace std;


int _tmain(int argc, _TCHAR* argv[])

{	CvCapture* capture = 0;

	capture = cvCreateCameraCapture(0);

	if(!capture){

		return -1;

	}

	IplImage *bgr_frame=cvQueryFrame(capture);

	cout << bgr_frame->depth;

	cout << bgr_frame->width;

	getch();

	return 0;

}

Web-камеры не подключены. Из устройств видео-захвата только tv-tuner.

Поставил BreakPoint. Содержимое capture посмотреть нельзя. Поэтому смотрю, что содержится а IplImage *bgr_frame:

nSize = 112

nChannels = 3

depth = 8

colorModel = "RGB"

channelSeq = "BGR"

align = 4

heigh = 4 (Вот тут я не пойму, почему высота 4, а не 480 например, как при подключении web-камеры)

width = 0

widthStep = 0

Таким образом, получается, что программа подхватывает видео-поток, но в нем содержится не то, что мне нужно. Не оцифрованное видео с композитного входа. Как бы изменить настройки тюнера, чтобы он выдавал то, что я от него жду.

Share this post


Link to post
Share on other sites

Новая беда:

из-за чего получаются такие изображения: Image?(взято питоном с ip-камеры)

(извиняюсь, если неправильно оформила)

Это камера? Инет?

Или руки?

З.Ы. По-прежнему python2.6+OpenCV2.0, ip-камера Edimax IC-3030PoE

Share this post


Link to post
Share on other sites

Мне кажется с параметрами jpeg сжатия переусердствовали, это обычно дает такие артефакты, у меня это явление битрейтом регулируется. Хотя изображение и правда несколько странное. Можно попробовать другие режимы кодирования выставить и посмотреть разницу.

Share this post


Link to post
Share on other sites

Я его просто забираю и сохраняю в png (это для ссылки уменьшила)

Но внешний вид его от этого не меняется png весом в 170Кб такое же.

Забираю как могу: QueryFrame, у камеры это считается MPEG4 RTSP

Может потому что я из видео кадры выдергиваю?

Share this post


Link to post
Share on other sites

У неё же есть вэб-интерфейс, там должны быть установки качества, кодека и FPS.

амера Edimax IC-3030 обеспечивает высокое качество картинки и большую частоту кадров, благодаря усовершенствованной видеокомпрессии. Для достижения наилучшего качества видео просто выберите H.264, MPEG4 или M-JPEG формат, в зависимости от условий вашей сети.

Share this post


Link to post
Share on other sites

Спасибо)

Т.е. выдергивать кадры - эт нормально? Просто настройки поковырять?

Беда... не лечится. :(

Пробовала с разными режимами MPEG4, H264. Как можно получить MJPEG - не знаю.

Share this post


Link to post
Share on other sites

Я выдергивал точно так же, и вроде все сносно вполне. Еще у меня адрес камеры в документации указан как:

http://login:password@IP_addr/GetData.cgi?
(так работает в браузере) , а с OpenCV заработал только когда я ему указал такое:
http://login:password@IP_addr/GetData.cgi?.mjpg

. Может Вам тоже что то а аналогичном формате сворганить?

Share this post


Link to post
Share on other sites

Неа, у меня пока только так работает:

rtsp://IP_addr:port/ipcam.sdp
(MPEG4) Еще
rtsp://IP_addr:port/ipcam_h264.sdp

(H264)причем картинку разобрать совсем сложно.

И то экспериментально найдено. В интерфейсе просто сказано, что путь к видеопотоку через RTSP: ipcam.sdp и ipcam_р264.sdp. MJPEG почему-то не упоминается.

Кривые изображения получаются при движении (в веб интерфейсе тоже иногда видно). Меньше всего казусов в MJPEG.

Вшитый детектор движения работает нормально.

Share this post


Link to post
Share on other sites

:) спасибо огромное) очень вкусно, но не работает... :)

попробую еще что-нить придумать, а если не получится - останусь на web-ке и не буду выделываться)

Share this post


Link to post
Share on other sites

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

Вот отсюда: http://www.axis.com/ftp/pub_soft/cam_srv/capture_driver/latest/

Share this post


Link to post
Share on other sites

Уважаемые, как сделать чтобы не воспроизводилось видео, а брался один кадр и вставлялся в PictureBox, т.е. тупо фоткало при нажатии на кнопку на форме? Пробовал использовать приведенный пример от Nicolа работает на ура, вебкамера включается, видео воспроизводится, но мне не нужно всех этих сложных функций. Объясните пожалуйста что конкретно нужно для фото по его примеру. Пытался использовать участки кода, всё безуспешно.

Share this post


Link to post
Share on other sites

У меня получилось загрузить изображение из файла в PictureBox, а вот с камеры никак пока. При использовании IplImage все работает и его распознает, а вот CvCapture никак не хочет признавать, пишет "использование неопределенного типа". Как его определить? И почему так?

Share this post


Link to post
Share on other sites

Создай CvCapture, захвати из него один кадр (cvQueryFrame), встать его в PictureBox и удали CvCapture (cvReleaseCapture).

Share this post


Link to post
Share on other sites

Smorodov, у вас камера Axis? Для Edimax у меня не вышло:

1.Установила драйвер

2.Сунула его в GraphEdit

3.Выстроила схему

4.Полезла в свойства CaptureFilter. получился такой url:

axmphttp://192.168.4.1/ipcam.sdp.mjpg
пробовала разные варианты. не может определить разрешение(видимо, из-за неправильного url) на том и загрузла. Кстати,
capture=highgui.cvCreateFileCapture('rtsp://192.168.1.4:554/ipcam.sdp.mjpg')

помогает, но с качеством всеж беда.

Share this post


Link to post
Share on other sites

На камерах Edimax, как правило, есть два видеоканала: основной (с мегапиксельным разрешением) и альтернативный (с маленьким разрешением). Это делается для экономии ресурсов: в архив сохраняется качественное видео, а на отображение и анализ с более низким разрешением.

Возможно, что получается именно альтернативный видеоканал. А что будет, если зайти в web-интерфейс камеры и поменять разрешение там?

Share this post


Link to post
Share on other sites

Создай CvCapture, захвати из него один кадр (cvQueryFrame), встать его в PictureBox и удали CvCapture (cvReleaseCapture).

Я уже так делал, всё равно вылезает куча всяких исключений и в итоге не фоткает камера. Если через стандартный cvShow то фотографирует и показывает фото, всё нормально, т.е. так:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

CvCapture *capture;

capture = cvCreateCameraCapture(CV_CAP_ANY);

//assert(capture);

// узнаем ширину и высоту кадра

//double width = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);

//double height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);

// получаем кадр

IplImage *frame=0;

frame = cvQueryFrame(capture);

//cvSaveImage("d:/11.jpg", frame);

cvShowImage("capture", frame);

// Копирование IplImage в объект .NET типа Image

//Image ^image = gcnew Bitmap(frame->width, frame->height, frame->widthStep,

//PixelFormat::Format24bppRgb, IntPtr(frame->imageData));

// Вставляем фото в pictureBox

//this->pictureBox1->Image = image;

// Освобождаем память

cvReleaseCapture(&capture);

//cvReleaseImage(&frame);

}

};

А если так, то не пашет ничего, убивает исключениями:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

CvCapture *capture;

capture = cvCreateCameraCapture(CV_CAP_ANY);

assert(capture);

// узнаем ширину и высоту кадра

//double width = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);

//double height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);

// получаем кадр

IplImage *frame=0;

frame = cvQueryFrame(capture);

//cvSaveImage("d:/11.jpg", frame);

//cvShowImage("capture", frame);

// Копирование IplImage в объект .NET типа Image

Image ^image = gcnew Bitmap(frame->width, frame->height, frame->widthStep,

PixelFormat::Format24bppRgb, IntPtr(frame->imageData));

// Вставляем фото в pictureBox

this->pictureBox1->Image = image;

// Освобождаем память

cvReleaseCapture(&capture);

//cvReleaseImage(&frame);

}

};

Share this post


Link to post
Share on other sites

Ну, конечно. При вызове cvReleaseCapture удаляется и frame. Поэтому надо делать:

pictureBox1->Image = cvCloneImage(frame);

А после pictureBox1->Image удалять. И перед cvCloneImage удалять, если он был создан ранее.

P.S. И научиться пользоваться тегами code тоже надо.

  • Like 1

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.

×