Работа с камерой почти ничем не отличается от работы с видео.
Просто вместо функции cvCreateFileCapture() нужно использовать функцию cvCreateCameraCapture(), которая в качестве параметра принимает не название файла, а идентификатор камеры.
Данная программа представляет собой удобную утилиту для работы с камерой.
Программа подключается и начинает захват с камеры с помощью cvCreateCameraCapture(), далее получает ширину и высоту кадра с помощью cvGetCaptureProperty(). А потом в цикле при помощи cvQueryFrame() получает картинку с камеры и выводит в окошко.
При нажатии клавиши ESC программа выйдет из цикла и завершится, а при нажатии клавиши Enter текущий кадр будет сохранён в файл ImageN.jpg, где N — номер кадра, начиная от 0 (Image0.jpg, Image1.jpg и т.д.)
Посмотрим результаты работы (камера – дешёвая USB Gembird 69U):
OpenCV v1.0 показывает и сохраняет картинку минимального разрешения камеры 320x240
Установить большее разрешение при помощи cvSetCaptureProperty() не даёт
А вот что выдаёт последняя стабильная версия OpenCV 2.1
у которой, кстати, сразу в комплекте идут скомпилированные lib-файлы C:\DevTools\OpenCV2.1\lib\ и которая завелась даже под VC++ 6.0 Установка аналогична 2.0 только теперь нужно линковать библиотеки cxcore210.lib cv210.lib highgui210.lib cvaux210.lib
так же заработало и при 1280x960.
Однако, должен отметить, что не всегда удаётся установить нужное разрешение штатными средствами и приходится делать финт ушами.
новые функции:
#define cvCaptureFromCAM cvCreateCameraCapture
CVAPI(CvCapture*) cvCreateCameraCapture( int index );
— начинает захват с камеры
index — номер камеры в системе (состоит из суммы порядкового номера и т.н. домена)
0 — первая попавшаяся камера(можно использовать, если работает всего одна камера)
возможные домены:
Скопировал пример один к одному. Все скомпилировалось, программа запускается, но выдает разрешение 0*0 и серый квадрат.
Камера в других приложения (проводник, VLC) нормально работает.
В чем может быть дело?
OpenCV 2.2.0, ОС Windows, VC++ 2005 Express Edition.
Библиотеки скомпилировались без ошибок, сделал все уроки со 2-го по 23-й, все работает, кроме захвата с камеры.
Камера в китайском телефоне, подключается телефон по USB, работает во всех приложениях без драйверов.
Пробовал не указывать разрешение, 320*240, 540*480.
Результат — серый квадрат, а в консоли информация о разрешении 0*0.
OpenCV 2.2, Windows, Code::Blocks.
Телефон от philips в качестве вебкамеры.
Пробывал менять — всё равно серый экран и выдаёт в качестве разрешения 0*0.
как видите — у вас с Upryamyj-м и камеры чем-то похожи, так что похоже проблема именно в доступе к камере — попробуйте использовать библиотеку videoInput
Уважаемый Господин! Возник у меня вопрос вот я сейчас пробежался и дошел увидел как раз урок — то что мне надо, это захват изображения с камеры, попробывал не работает, хотя камера не с телефона нормальная 720p, Посмотрел библиотеку videoInput и вопрос смогу ли я захватив камеры с этой библиотекой сохранить его в файл, и смогу ля я к этому захваченному изображению применять функции из OpenCV прям то есть находу, а не открывая сохраненный видеофайл заново Я нуб в этом деле) Спасибо за Help))))
Не могу сделать захват со второй камеры. Opencv 2.2 win QtSDK 4.7.4
cvCreateCameraCapture -индексам <0...10, 10...99, 200...299 всегда соответствует захват 1 камеры, остальные возвращает нулевыми
Обе камеры определяются как видеоустройства 1 и 2. Штатными средствами ОС можно с них получить картинку.
В faq ocv видел ссылки на модуль cvcam с инструментарием для выбора камеры, но, похоже из текущих версий библиотеки его убрали.
Вообще стоит задача получения синхронных снимков с нескольких камер.
к сожалению, пока руки никак не дойдут поработать со стереозрением, хотя в планах это и есть (для начала, хотя бы купить две одинаковых камеры :)))
Для конкретных задач, похоже, лучше всё же использовать не штатный захват OpenCV, а кастомные решения.
Например, под Windows — можно попробовать библиотеку videoInput, а под Linux — libv4l2cam.
Спасибо за быстрый ответ и ссылочку!
Однако вопросы ещё имеются.
1. Нельзя ли для работы с IP-камерой использовать возможности только самой OpenCV?
Работать-то с USB-камерами в OpenCV очень просто: в одной строке захватил камеру, в другой — считал кадр, в третьей — показал его. Хочется такого же комфорта и с IP-камерой.
2. Ваш вариант работает только с MJPEG, а как работать с MPEG-4, H.264, наконец, просто JPEG?
3. Как всё это организовать на чистом Си (без "++")?
если OpenCV собран с поддержкой FFmpeg и ffmpeg позволяет работать, то должен подхватить ;)
т.е. будет достаточно сделать стандартный
cv::VideoCapture vcap;
// This works on a D-Link CDS-932L
const std::string videoStreamAddress = "http://<username:password>@<ip_address>/video.cgi?.mjpg";
//open the video stream and make sure it's opened
if(!vcap.open(videoStreamAddress)) {
std::cout << "Error opening video stream" << std::endl;
return -1;
}
Как узнать, собран OpenCV с поддержкой FFmpeg или нет?
Я имею ввиду вариант, когда OpenCV не собирается из исходников (CMake и всё такое), а используется «из коробки». Интересуют последние, на текущий момент, версии OpenCV: 2.4.3… 2.4.5.
Добрый вечер! Столкнулся с проблемой: Скопировал пример, все работает, НО! изображение идет с ТВ-тюнера! Кто-нибудь сталкивался с подобным? Какой параметр cvCreateCameraCapture( int index ) указать для обычной веб-камеры? Как в программе указать, с какой камерой (устройством видеозахвата) нужно работать?
Ребят, нужна помощь. Хочу эту программу совместить с программой для подсчета и определения доминирующих цветов в изображении. Нужно чтобы камера по нажатию кнопки фотографировала и определяла доминирующие цвета в полученном изображении. Как это правильно сделать? Вот ссылка на прогу, определяющую доминирующие цвета robocraft.ru/blog/computervision/1063.html
Здравствуйте.
Как у некоторых выше, и я получил черный экран. Вебка USB, дрова винда сама поставила. Библиотеку videoInput мне не удалось прикрутить к Eclipse Kepler + MinGW 4.8.1 + OpenCV 3.1.0. Но пример с этой страницы успешно заработал. Подскажите пожалуйста как теперь мне например воспользоватся функцией cvSmooth тоесть как из переменной типа «Mat» взять данные типа «IplImage». Я Си++ почти незнаю, только начал изучать, а попробовать хочется.
Привет!
Если используется интерфейс C++, то и функции логичнее использовать С++-ые, которые работают с cv::Mat.
Хотя cvSmooth() считается устаревшей и вместо неё рекомендуется использовать: GaussianBlur(), blur(), medianBlur()
Преобразовать cv::Mat в IplImage можно при помощи оператора IplImage.
Можно примерчик с этим оператором. После Си не совсем въеду как им пользоватся. функцию взял для примера, ведь во всех мануалах подобные функции. Не подскажите где почитать на русском по поводу устаревших и их рекомендуемой замены? Цель как и у многих — научится распознавать предметы, попутно изучая Си++.
// To pass the new matrices to the functions that only work with IplImage or CvMat do:
// step 1) Convert the headers (tip: data will not be copied).
// step 2) call the function (tip: to pass a pointer do not forget unary "&" to form pointers)
cv::Mat mat_img;
IplImage ipl_img = mat_img;
// преобразование IplImage в cv::Mat
// и обратно
IplImage ipl_img;
cv::Mat mat_img(ipl_img);
VideoCapture cap(CAP_ANY); // открыть доступную камеру
if (!cap.isOpened()) // проверить открылась ли
return -1;
Mat frame;
namedWindow("original", WINDOW_AUTOSIZE);
cap >> frame; // получаем очередной кадр
imshow("original", frame); // выводим кадр в окно
IplImage* image = 0;
cvNamedWindow("test", WINDOW_AUTOSIZE);
// как сделать чтоб в image попал этот же кадр и например вывести его в другое окошко функцией ниже (либо использовать любую другую функцию)
// что я не делал либо проблемы при компиляции либо открывается окошко и "программа завершила свою работу, поиск решений бла-бла"
cvShowImage("test", image);
P.S нужно ли специально освобождать память как в здешних мануалах, в примере с VideoCapture сказано чтото про автоматически освободится или я не так понял.
Здравствуйте! Сделал все как указано в уроке, но при запуске программы получаю черное окошко, в котором по идее должно отображаться изображение с вебки. Вебка при этом включается, но изображение не выводится, только черный квадрат. Как это можно решить?
Visual Studio 2015, OpenCV 3.1.0
Суть еще в том, что, если данный код закомпилить на 2012 студии то проблем не возникает, но хотелось бы разобраться в чем проблема в 15 студии и как это можно решить
Комментарии (49)
RSS свернуть / развернутьКамера в других приложения (проводник, VLC) нормально работает.
В чем может быть дело?
Upryamyj
какая камера?
пробовали изменить разрешение/ не изменять разрешения (оставить дефолтным)?
noonv
Библиотеки скомпилировались без ошибок, сделал все уроки со 2-го по 23-й, все работает, кроме захвата с камеры.
Камера в китайском телефоне, подключается телефон по USB, работает во всех приложениях без драйверов.
Пробовал не указывать разрешение, 320*240, 540*480.
Результат — серый квадрат, а в консоли информация о разрешении 0*0.
Upryamyj
Upryamyj
noonv
CaptNemo
passick
noonv
Телефон от philips в качестве вебкамеры.
Пробывал менять — всё равно серый экран и выдаёт в качестве разрешения 0*0.
passick
noonv
jne100
В Линукс не работает. Поменял на 10 запустилось. Видимо в Линуксе в конце строки LF а не CR
v1ctor
noonv
DOMOVOI
так что в image уже хранится данные захваченной картинки и к ней можно применять средства OpenCV.
noonv
cvCreateCameraCapture -индексам <0...10, 10...99, 200...299 всегда соответствует захват 1 камеры, остальные возвращает нулевыми
Обе камеры определяются как видеоустройства 1 и 2. Штатными средствами ОС можно с них получить картинку.
В faq ocv видел ссылки на модуль cvcam с инструментарием для выбора камеры, но, похоже из текущих версий библиотеки его убрали.
Вообще стоит задача получения синхронных снимков с нескольких камер.
ibnz
Для конкретных задач, похоже, лучше всё же использовать не штатный захват OpenCV, а кастомные решения.
Например, под Windows — можно попробовать библиотеку
noonv
ibnz
ales_aleles
igormat
noonv
Misha
noonv
Однако вопросы ещё имеются.
1. Нельзя ли для работы с IP-камерой использовать возможности только самой OpenCV?
Работать-то с USB-камерами в OpenCV очень просто: в одной строке захватил камеру, в другой — считал кадр, в третьей — показал его. Хочется такого же комфорта и с IP-камерой.
2. Ваш вариант работает только с MJPEG, а как работать с MPEG-4, H.264, наконец, просто JPEG?
3. Как всё это организовать на чистом Си (без "++")?
Misha
т.е. будет достаточно сделать стандартный
noonv
Как узнать, собран OpenCV с поддержкой FFmpeg или нет?
Я имею ввиду вариант, когда OpenCV не собирается из исходников (CMake и всё такое), а используется «из коробки». Интересуют последние, на текущий момент, версии OpenCV: 2.4.3… 2.4.5.
Misha
goga770
CvCapture* capture = cvCaptureFromCAM( 1 );
goga770
jacknk88
noonv
jacknk88
posehn
Lokki23
admin
Как у некоторых выше, и я получил черный экран. Вебка USB, дрова винда сама поставила. Библиотеку videoInput мне не удалось прикрутить к Eclipse Kepler + MinGW 4.8.1 + OpenCV 3.1.0. Но пример с
Apparatchik
Если используется интерфейс C++, то и функции логичнее использовать С++-ые, которые работают с cv::Mat.
Хотя
Преобразовать cv::Mat в IplImage можно при помощи оператора
noonv
Apparatchik
Про устаревшие и замену — только в документации.
noonv
P.S нужно ли специально освобождать память как в здешних мануалах, в примере с VideoCapture сказано чтото про автоматически освободится или я не так понял.
Apparatchik
Второй вопрос остается в силе.
Apparatchik
Один кадр я беру так:
Как мне скопировать этот кадр и дальше обрабатывать его независимо?
вот так не работает, вернее работает но нарисованое на frame попадает в frame_2.
Apparatchik
noonv
Apparatchik
Visual Studio 2015, OpenCV 3.1.0
Batradz
admin
Batradz
Batradz
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.