Smorodov 578 Report post Posted April 11, 2010 Добрый вечер. Подскажите пожалуйста, как мне получить список веб камер, чтоб была возможность выбрать одну из работающих в системе? Такой вызов вдолжен выбросить диалог выбора камеры. CvCapture* capture = cvCaptureFromCAM( -1 ); Share this post Link to post Share on other sites
tybik 0 Report post Posted April 11, 2010 Такой вызов вдолжен выбросить диалог выбора камеры. 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
Rekaru 0 Report post Posted April 14, 2010 Видел в сети пример в котором показано как работать с 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
RinOS 16 Report post Posted April 15, 2010 Например AXIS Camera Control SDK http://www.axis.com/techsup/software/acc/index.htm Что собственно в 8 посте я и написал, только использовал не AXIS Camera Control SDK, а Axis Video Capture Driver. Share this post Link to post Share on other sites
Vitek 0 Report post Posted April 23, 2010 Я бы попробовал открывать по очереди все камеры, до тех пор пока открываются. Как не открылась, так значит камеры кончились.)) int i=0; CvCapture* cap; while(cap=cvCaptureFromCAM(i++)) cvReleaseCapture(cap);[/codebox] Как то так например. В i по хорошему должно остаться количество доступных камер. Share this post Link to post Share on other sites
tybik 0 Report post Posted May 6, 2010 Я бы попробовал открывать по очереди все камеры, до тех пор пока открываются. Как не открылась, так значит камеры кончились.)) 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
Smorodov 578 Report post Posted May 6, 2010 у меня этот кусок кода не работает. Биледру не нравиться cvReleaseCapture(cap); Правильно, надо проверять чтобы cap было не NULL. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted May 6, 2010 Правильно, надо проверять чтобы cap было не NULL. У него проверяется. Дело скорее в отсутствии символа & перед cap. Share this post Link to post Share on other sites
noonv 3 Report post Posted June 29, 2010 пробую изменить разрешение камеры 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
Smorodov 578 Report post Posted June 29, 2010 У меня, например, параметры камеры устанавливаются Logitech-овской прогой в трее, через OpenCv не пробовал, и думаю что не получится , я постоянно использую максимальное разрешение, потом масштабирую (уменьшаю в основном): cvResize(frame, frame_resized, CV_INTER_LINEAR); где: frame - кадр с камеры, frame_resized - изображение нужного размера. ЗЫ: мне кажется, что камера у Вас не поддерживает запрашиваемое разрешение (см. документацию). Share this post Link to post Share on other sites
AndreyDmitriev 0 Report post Posted June 29, 2010 У меня изменение ширины и высоты при помощи cvSetCaptureProperty работает. Другое дело, что оно работает немного странно. Дело в том, что при уменьшении разрешения должно расти количество картинок в секунду. Например при максимальном разрешении моя камера отдаёт только 15 картинок, а при половинном разрешении все 30. Но этого не происходит - картинка-то уменьшается, а вот скорость не растёт. Ну и не каждое разрешение можно установить, а только то, которое поддерживает камера. Кроме того, ширина и высота - единственные параметры, которые можно установить. Было бы здорово, если бы с помощью cvSetCaptureProperty также можно было бы установить яркость, контраст и гамму (и в библиотеке константы уже приготовлены), но чтобы это реализовать надо глубоко покопаться в исходниках (вроде как VideoInput за это отвечает). Share this post Link to post Share on other sites
noonv 3 Report post Posted June 30, 2010 пробовал и ресайзить, но это ничего не даёт. Дело в том, что если запускаю камеру с дефолтным разрешением - она показывает чёрный экран. Сторонняя софтина начинает показывать картинку, только если уменьшить разрешение. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted June 30, 2010 пробовал и ресайзить, но это ничего не даёт. Дело в том, что если запускаю камеру с дефолтным разрешением - она показывает чёрный экран. Сторонняя софтина начинает показывать картинку, только если уменьшить разрешение. OpenCv- шные примеры тоже выводят черный экран? Share this post Link to post Share on other sites
noonv 3 Report post Posted July 1, 2010 Ввиду проблемы, поднятой в теме про установку разрешения начал разбираться, как OpenCV работает с видеопотоком. Т.к. на примере AMCap я вижу, что DirectShow работает с камерой нормально (пусть и не на максимальном разрешении) Я так понимаю, что работа ведётся через VFW. Хотя какие-то наброски работы через DirectShow есть. Возник вопрос - как подружить DirectShow и openCV ? Толковых библиотек DirectShow пока не нашёл и пока пробую videoInput, но опять-таки безрезультатно Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted July 1, 2010 Какую версию OpenCV используешь? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted July 2, 2010 Зайди в исходники OpenCV: в файле cvcap.cpp есть функция cvCreateCameraCapture. В ней используется захват с камеры через DirectShow, если определён макрос HAVE_VIDEOINPUT. У меня в версии 2.1 он определён. Попробуй в отладчике зайти в эту функцию и проверь: создаётся ли DirectShow-камера с помощью функции cvCreateCameraCapture_DShow. Share this post Link to post Share on other sites
noonv 3 Report post Posted July 2, 2010 Спасибо! интересно - во второй версии точно так же. Причём, полез смотреть cvCreateCameraCapture_DShow, так она, в итоге, работает через ту же библиотеку videoInput Но! Работать штатно не получается, а вот через внешнее прикручивание videoInput вроде бы что-то получилось. Share this post Link to post Share on other sites
RinOS 16 Report post Posted September 1, 2010 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
Dasdranagon 1 Report post Posted September 1, 2010 Сделал все как по инструкции) Заработало! Но обнаружился один МЕГА баг, в общем утечка памяти. 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
RinOS 16 Report post Posted September 2, 2010 На первый взгляд ошибка в следующем: Вынеси определение объекта 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
Dasdranagon 1 Report post Posted September 2, 2010 Не помогло. Я даже делал циклический буфер, то есть что бы делать cvReleaseImage не сразу, а по прошествии некоторого времени, все равно ошибка вылетает. Да, странно.. В данном случае cvReleaseImage вообще не нужен. После цикла только cvReleaseCapture( &capture ); Ну и не забыть cvDestroyAllWindows(); Share this post Link to post Share on other sites
Android_2012 0 Report post Posted September 5, 2010 Здравствуйте! У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на 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
Smorodov 578 Report post Posted September 5, 2010 Здравствуйте! У меня есть ноутбук со встроенной веб-камерой. Я создал не большей проект на 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