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

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

Recommended Posts

Nuzhny

Спасибо.

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

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


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

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

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

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


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

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

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

highgui.cvShowImage('film',fr)

highgui.cvWaitKey(0)

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

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


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

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

while 1:

      fr=highgui.cvQueryFrame(capture)

      highgui.cvShowImage('film',fr)

      highgui.cvWaitKey(1)

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

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

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


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

Добрый день!

Написал программу, которая захватывает кадры с 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-камеры?

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


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

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

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

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

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


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

Сейчас набросал тестовую программку, чтобы посмотреть содержимое 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

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

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


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

Нашел вот такую вот программу:

http://www.ronyasoft.nm.ru/virtguard/index.html

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

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


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

Новая беда:

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

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

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

Или руки?

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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


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

Спасибо)

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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


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

Создай 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);

}

};

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


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

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

pictureBox1->Image = cvCloneImage(frame);

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

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

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×