7. OpenCV шаг за шагом. Захват видео с камеры
Работа с камерой почти ничем не отличается от работы с видео. Просто вместо функции cvCreateFileCapture() нужно использовать функцию cvCreateCameraCapture(), которая в качестве параметра принимает не название файла, а идентификатор камеры. Данная программа представляет собой удобную утилиту для работы с камерой. Программа подключается и начинает захват с камеры с помощью cvCreateCameraCapture(), далее получает ширину и высоту кадра с помощью cvGetCaptureProperty(). А потом в цикле при помощи cvQueryFrame() получает картинку с камеры и выводит в окошко. При нажатии клавиши ESC программа выйдет из цикла и завершится, а при нажатии клавиши Enter текущий кадр будет сохранён в файл ImageN.jpg, где N — номер кадра, начиная от 0 (Image0.jpg, Image1.jpg и т.д.)
Посмотрим результаты работы (камера – дешёвая USB Gembird 69U):
OpenCV v1.0 показывает и сохраняет картинку минимального разрешения камеры 320×240 Установить большее разрешение при помощи cvSetCaptureProperty() не даёт
А вот что выдаёт последняя стабильная версия OpenCV 2.1
у которой, кстати, сразу в комплекте идут скомпилированные lib-файлы C:\DevTools\OpenCV2.1\lib\ и которая завелась даже под VC++ 6.0 Установка аналогична 2.0 только теперь нужно линковать библиотеки cxcore210.lib cv210.lib highgui210.lib cvaux210.lib
а теперь раскомментируем строчки
так же заработало и при 1280×960. Однако, должен отметить, что не всегда удаётся установить нужное разрешение штатными средствами и приходится делать финт ушами.
— начинает захват с камеры
index — номер камеры в системе (состоит из суммы порядкового номера и т.н. домена) 0 — первая попавшаяся камера(можно использовать, если работает всего одна камера) возможные домены:
— сохраняет изображение в файл filename — имя файла image — изображение для сохранения
при успешном сохранении функция вернёт 1, а при неудаче — 0.
58 комментариев на «“7. OpenCV шаг за шагом. Захват видео с камеры”»Скопировал пример один к одному. Все скомпилировалось, программа запускается, но выдает разрешение 0*0 и серый квадрат. Камера в других приложения (проводник, VLC) нормально работает. В чем может быть дело?
версия OpenCV? какая камера? пробовали изменить разрешение/ не изменять разрешения (оставить дефолтным)?
OpenCV 2.2.0, ОС Windows, VC++ 2005 Express Edition. Библиотеки скомпилировались без ошибок, сделал все уроки со 2-го по 23-й, все работает, кроме захвата с камеры. Камера в китайском телефоне, подключается телефон по USB, работает во всех приложениях без драйверов. Пробовал не указывать разрешение, 320*240, 540*480. Результат — серый квадрат, а в консоли информация о разрешении 0*0.
похоже проблема именно в доступе к камере — попробуйте использовать библиотеку videoInput
Была та же проблема. Помогает videoInput. И еще у меня заработало после включения программы WebcamMax. Кто-нибудь знает как работает эта программа?
Тоже самое, что и у «Upryamyj»-серый квадрат и разрешение 0*0. Что делать? Может, проблемы с камерой?
OpenCV 2.2, Windows, Code::Blocks. Телефон от philips в качестве вебкамеры. Пробывал менять — всё равно серый экран и выдаёт в качестве разрешения 0*0.
как видите — у вас с Upryamyj-м и камеры чем-то похожи, так что похоже проблема именно в доступе к камере — попробуйте использовать библиотеку videoInput
У меня камера нормальная, также разрешение 0 на 0 если использовать cvCreateCameraCapture, но videoinput к счастью помогла 🙂
В Линукс не работает. Поменял на 10 запустилось. Видимо в Линуксе в конце строки LF а не CR
верно — в линуксе коды клавиш отличаются 🙂
Уважаемый Господин! Возник у меня вопрос вот я сейчас пробежался и дошел увидел как раз урок — то что мне надо, это захват изображения с камеры, попробывал не работает, хотя камера не с телефона нормальная 720p, Посмотрел библиотеку videoInput и вопрос смогу ли я захватив камеры с этой библиотекой сохранить его в файл, и смогу ля я к этому захваченному изображению применять функции из OpenCV прям то есть находу, а не открывая сохраненный видеофайл заново Я нуб в этом деле) Спасибо за Help))))
да. там же в исходнике есть комментарий:
так что в image уже хранится данные захваченной картинки и к ней можно применять средства OpenCV.
Не могу сделать захват со второй камеры. 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 .
да videoinput помог с решением, спасибо.
серый квадрат вылечился заменой на cvCaptureFromCAM(1)
Добрый день. А нет ли здесь утечки памяти? не нужно ли делать в конце каждого цикла cvReleaseImage(&frame)?
нет. с картинкой frame, получаемой от cvQueryFrame() ничего делать не нужно.
А как подключать IP-камеры?
если камера выдаёт картинку в MJPG, то посмотрите сюда
Спасибо за быстрый ответ и ссылочку! Однако вопросы ещё имеются. 1. Нельзя ли для работы с IP-камерой использовать возможности только самой OpenCV? Работать-то с USB-камерами в OpenCV очень просто: в одной строке захватил камеру, в другой — считал кадр, в третьей — показал его. Хочется такого же комфорта и с IP-камерой. 2. Ваш вариант работает только с MJPEG, а как работать с MPEG-4, H.264, наконец, просто JPEG? 3. Как всё это организовать на чистом Си (без "++")?
если OpenCV собран с поддержкой FFmpeg и ffmpeg позволяет работать, то должен подхватить 😉 т.е. будет достаточно сделать стандартный
Спасибо за быстрый ответ!
Как узнать, собран OpenCV с поддержкой FFmpeg или нет?
Я имею ввиду вариант, когда OpenCV не собирается из исходников (CMake и всё такое), а используется «из коробки». Интересуют последние, на текущий момент, версии OpenCV: 2.4.3… 2.4.5.
Добрый вечер! Столкнулся с проблемой: Скопировал пример, все работает, НО! изображение идет с ТВ-тюнера! Кто-нибудь сталкивался с подобным? Какой параметр cvCreateCameraCapture( int index ) указать для обычной веб-камеры? Как в программе указать, с какой камерой (устройством видеозахвата) нужно работать?
Перечитал форум, разобрался))) CvCapture* capture = cvCaptureFromCAM( 1 );
какой протокол использует opencv при работе с камерами?
есть ли примеры по кадровой обработки видео, т.е. в реальном времени сравнить два кадра, пр., текущий и предыдущий кадр?
Ребят, нужна помощь. Хочу эту программу совместить с программой для подсчета и определения доминирующих цветов в изображении. Нужно чтобы камера по нажатию кнопки фотографировала и определяла доминирующие цвета в полученном изображении. Как это правильно сделать? Вот ссылка на прогу, определяющую доминирующие цвета 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 .
Можно примерчик с этим оператором. После Си не совсем въеду как им пользоватся.
Можно примерчик с этим оператором. После Си не совсем въеду как им пользоватся. функцию взял для примера, ведь во всех мануалах подобные функции. Не подскажите где почитать на русском по поводу устаревших и их рекомендуемой замены? Цель как и у многих — научится распознавать предметы, попутно изучая Си++.
Про устаревшие и замену — только в документации.
Не выходит чет у меня:
P.S нужно ли специально освобождать память как в здешних мануалах, в примере с VideoCapture сказано чтото про автоматически освободится или я не так понял.
С первым разобрался, огромное спасибо за помощь. Кому интересно надо было сделать так:
Второй вопрос остается в силе.
Здравствуйте! Сделал все как указано в уроке, но при запуске программы получаю черное окошко, в котором по идее должно отображаться изображение с вебки. Вебка при этом включается, но изображение не выводится, только черный квадрат. Как это можно решить? Visual Studio 2015, OpenCV 3.1.0
Попробуйте пройтись отладчиком ( OpenCV и работа с видео )
Не очень разобрался, с тем как с этим работать, не могли бы описать действия?
Суть еще в том, что, если данный код закомпилить на 2012 студии то проблем не возникает, но хотелось бы разобраться в чем проблема в 15 студии и как это можно решить
Все запускаю на установленной Visual Studio 2017, opencv запускаю через Cmake. При запуске в верхнем левом углу все как надо написано(В главном окне программы), Opencv — Visual Studio. Но при запуске кода вылазеют вот такие ошибки.
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка (активно) E1696 не удается открыть источник файл «cv.h» ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 1 Ошибка (активно) E1696 не удается открыть источник файл «highgui.h» ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 2 Ошибка (активно) E0020 идентификатор «CvCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «capture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «cvCreateCameraCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «CV_CAP_ANY» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «cvCaptureFromCAM» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 10 Ошибка (активно) E0020 идентификатор «assert» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 11 Ошибка (активно) E0020 идентификатор «ширину» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 17 Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 19 Ошибка (активно) E0020 идентификатор «cvGetCaptureProperty» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24 Ошибка (активно) E0020 идентификатор «CV_CAP_PROP_FRAME_HEIGHT» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24 Ошибка (активно) E0020 идентификатор «width» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 25 Ошибка (активно) E0020 идентификатор «IplImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27 Ошибка (активно) E0020 идентификатор «frame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27 Ошибка (активно) E0020 идентификатор «cvNamedWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29 Ошибка (активно) E0020 идентификатор «CV_WINDOW_AUTOSIZE» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29 Ошибка (активно) E0020 идентификатор «cvQueryFrame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 40 Ошибка (активно) E0020 идентификатор «cvShowImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 43 Ошибка (активно) E0020 идентификатор «cvWaitKey» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 45 Ошибка (активно) E0020 идентификатор «кадр» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 51 Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 53 Ошибка (активно) E0020 идентификатор «cvSaveImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 56 Ошибка (активно) E0029 требуется выражение ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 57 Ошибка (активно) E0020 идентификатор «ресурсы» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 61 Ошибка (активно) E0020 идентификатор «cvDestroyWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 63 Ошибка C1010 непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include «stdafx.h»" в источник. ConsoleApplication3 c:\users\user\source\repos\consoleapplication3\consoleapplication3\consoleapplication3.cpp 66
Проверьте — прописаны ли пути до заголовочных файлов OpenCV в настройках проекта.
Ошибка по отсутствию файлов cv.h,highgui.h и т.д, ушла.
Остались ошибки, отсутствия индентификаторов:
Ошибка (активно) E0020 идентификатор «CvCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «capture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «cvCreateCameraCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «CV_CAP_ANY» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9 Ошибка (активно) E0020 идентификатор «cvCaptureFromCAM» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 10 Ошибка (активно) E0020 идентификатор «assert» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 11 Ошибка (активно) E0020 идентификатор «ширину» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 17 Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 19 Ошибка (активно) E0020 идентификатор «cvGetCaptureProperty» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24 Ошибка (активно) E0020 идентификатор «CV_CAP_PROP_FRAME_HEIGHT» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24 Ошибка (активно) E0020 идентификатор «width» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 25 Ошибка (активно) E0020 идентификатор «IplImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27 Ошибка (активно) E0020 идентификатор «frame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27 Ошибка (активно) E0020 идентификатор «cvNamedWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29 Ошибка (активно) E0020 идентификатор «CV_WINDOW_AUTOSIZE» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29 Ошибка (активно) E0020 идентификатор «cvQueryFrame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 40 Ошибка (активно) E0020 идентификатор «cvShowImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 43 Ошибка (активно) E0020 идентификатор «cvWaitKey» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 45 Ошибка (активно) E0020 идентификатор «кадр» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 51 Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 53 Ошибка (активно) E0020 идентификатор «cvSaveImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 56 Ошибка (активно) E0029 требуется выражение ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 57 Ошибка (активно) E0020 идентификатор «ресурсы» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 61 Ошибка (активно) E0020 идентификатор «cvDestroyWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 63
Выше описанные ошибки исправил. Вот новые, как исправить? Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C4996 ‘cv::flann::Index_’: was declared deprecated ConsoleApplication2 c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\opencv2\flann\flann.hpp 233 Ошибка C2857 ‘#include’ statement specified with the /Ycstdafx.h,stdafx.hpp command-line option was not found in the source file ConsoleApplication2 c:\users\user\documents\visual studio 2015\projects\consoleapplication2\consoleapplication2\stdafx.cpp 9
Вторую исправил, осталась первая. Вот, часть кода из класса flann.hpp, который вызывает ошибку, ошибка на странице с функцией public.
/** * @deprecated Use GenericIndex class instead */ template class FLANN_DEPRECATED Index_