Captain 0 Report post Posted November 17, 2011 Nuzhny Спасибо. После добавления cvWaitKey(1) в бесконечный цикл всё заработало. Share this post Link to post Share on other sites
Captain 0 Report post Posted November 23, 2011 Ещё вопрос: как в OpenCV узнать все режимы работы камеры? Т.е. как для объекта CvCapture получить список доступных разрешений? Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 23, 2011 Пишу "на ощупь": 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
marfusha 0 Report post Posted November 23, 2011 Ой! заметила, что начинает выдавать картинку кадра после 10го. Включила видео while 1: fr=highgui.cvQueryFrame(capture) highgui.cvShowImage('film',fr) highgui.cvWaitKey(1) видна где-то секундная задержка(серый фон), дальше видео. это особенности камеры или скорость инета? адаптация? Share this post Link to post Share on other sites
ibn_maksimys 2 Report post Posted November 23, 2011 Добрый день! Написал программу, которая захватывает кадры с 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
Nuzhny 243 Report post Posted November 23, 2011 1. capture создаётся? 2. Если у тебя тюнер и web-камера, то попробуй разные индексы в cvCaptureFromCAM. 3. Может, твоя камера поддерживает только какие-то экзотические цветовые пространства? Я бы прошёл в отладчике все внутренности cvCaptureFromCAM. Share this post Link to post Share on other sites
ibn_maksimys 2 Report post Posted November 25, 2011 Сейчас набросал тестовую программку, чтобы посмотреть содержимое 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
ibn_maksimys 2 Report post Posted November 25, 2011 Нашел вот такую вот программу: http://www.ronyasoft.nm.ru/virtguard/index.html Красота, да и только. Как бы их исходники раздобыть, чтобы посмотреть, как у них работа тюнером организована. Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 25, 2011 Новая беда: из-за чего получаются такие изображения: Image?(взято питоном с ip-камеры) (извиняюсь, если неправильно оформила) Это камера? Инет? Или руки? З.Ы. По-прежнему python2.6+OpenCV2.0, ip-камера Edimax IC-3030PoE Share this post Link to post Share on other sites
Smorodov 578 Report post Posted November 25, 2011 Мне кажется с параметрами jpeg сжатия переусердствовали, это обычно дает такие артефакты, у меня это явление битрейтом регулируется. Хотя изображение и правда несколько странное. Можно попробовать другие режимы кодирования выставить и посмотреть разницу. Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 25, 2011 Я его просто забираю и сохраняю в png (это для ссылки уменьшила) Но внешний вид его от этого не меняется png весом в 170Кб такое же. Забираю как могу: QueryFrame, у камеры это считается MPEG4 RTSP Может потому что я из видео кадры выдергиваю? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted November 25, 2011 У неё же есть вэб-интерфейс, там должны быть установки качества, кодека и FPS. амера Edimax IC-3030 обеспечивает высокое качество картинки и большую частоту кадров, благодаря усовершенствованной видеокомпрессии. Для достижения наилучшего качества видео просто выберите H.264, MPEG4 или M-JPEG формат, в зависимости от условий вашей сети. Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 25, 2011 Спасибо) Т.е. выдергивать кадры - эт нормально? Просто настройки поковырять? Беда... не лечится. Пробовала с разными режимами MPEG4, H264. Как можно получить MJPEG - не знаю. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted November 25, 2011 Я выдергивал точно так же, и вроде все сносно вполне. Еще у меня адрес камеры в документации указан как: 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
marfusha 0 Report post Posted November 25, 2011 Неа, у меня пока только так работает: 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
Smorodov 578 Report post Posted November 25, 2011 Вотс http://www.edimax.us/html/Faq/How%20to%20view%20the%20video%20stream%20of%20Edimax%20Camera%20directly.pdf Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 25, 2011 спасибо огромное) очень вкусно, но не работает... попробую еще что-нить придумать, а если не получится - останусь на web-ке и не буду выделываться) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted November 25, 2011 Можно попробовать еще драйвер от Axis поставить (в начале темы обсуждается). Может быть он подойдет (я ставил - работало). Вот отсюда: http://www.axis.com/ftp/pub_soft/cam_srv/capture_driver/latest/ Share this post Link to post Share on other sites
JoQeR 0 Report post Posted November 25, 2011 Уважаемые, как сделать чтобы не воспроизводилось видео, а брался один кадр и вставлялся в PictureBox, т.е. тупо фоткало при нажатии на кнопку на форме? Пробовал использовать приведенный пример от Nicolа работает на ура, вебкамера включается, видео воспроизводится, но мне не нужно всех этих сложных функций. Объясните пожалуйста что конкретно нужно для фото по его примеру. Пытался использовать участки кода, всё безуспешно. Share this post Link to post Share on other sites
JoQeR 0 Report post Posted November 25, 2011 У меня получилось загрузить изображение из файла в PictureBox, а вот с камеры никак пока. При использовании IplImage все работает и его распознает, а вот CvCapture никак не хочет признавать, пишет "использование неопределенного типа". Как его определить? И почему так? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 26, 2011 Создай CvCapture, захвати из него один кадр (cvQueryFrame), встать его в PictureBox и удали CvCapture (cvReleaseCapture). Share this post Link to post Share on other sites
marfusha 0 Report post Posted November 28, 2011 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
Nuzhny 243 Report post Posted November 28, 2011 На камерах Edimax, как правило, есть два видеоканала: основной (с мегапиксельным разрешением) и альтернативный (с маленьким разрешением). Это делается для экономии ресурсов: в архив сохраняется качественное видео, а на отображение и анализ с более низким разрешением. Возможно, что получается именно альтернативный видеоканал. А что будет, если зайти в web-интерфейс камеры и поменять разрешение там? Share this post Link to post Share on other sites
JoQeR 0 Report post Posted November 28, 2011 Создай 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
Nuzhny 243 Report post Posted November 28, 2011 Ну, конечно. При вызове cvReleaseCapture удаляется и frame. Поэтому надо делать: pictureBox1->Image = cvCloneImage(frame); А после pictureBox1->Image удалять. И перед cvCloneImage удалять, если он был создан ранее. P.S. И научиться пользоваться тегами code тоже надо. 1 Share this post Link to post Share on other sites