Захват Видео С Камеры

Posted on -

Довольно часто возникает необходимость определения движения в видеопотоке (например, в охранных целях — это гораздо дешевле и надёжнее, чем ставить живого оператора). Сегодня я вам расскажу, как написать простенький детектор движения, используя только веб камеру. Так как у нас, программистов, принято разбивать задачи на подзадачи, то у нас есть две подзадачи: первая — научиться захватывать видео с камеры (для простоты возьмём Web-камеру), а вторая, собственно — определять движение.

Захват

Давайте сначала определимся — что представляет собой захват видео и для чего он нужен? Ответ на второй вопрос очевиден: если мы хотим подвергнуть компьютерной обработке снятое на камеру (или из иного источника) видео, то прежде всего нужно это видео каким-то образом переместить на жесткий диск компьютера. А вот что касается первого вопроса — тут однозначного ответа быть не может. Дело в том, что тот или иной источник видео требует своего, специального, способа захвата.

Скажу сразу, что писать я буду на Delphi. Кому не нравится — могут не читать. Итак, без лишних слов, приступим.

Захват видео Всё зависит от типа вашей камеры. Самые распространённые — это web-камеры. Сегодня они есть почти в каждом ноутбуке. Для захвата видео с веб-камеры существует множество инструментов. Наиболее часто используемый — библиотека AVICAP32.DLL, хотя есть и другие.

Выберите Файл>Запись видео и там выберите вебкамеру для захвата видео. Записать видео с веб-камеры можно с помощью простого приложения прямо на нашем сайте! Для перехода нажмите ниже «Запустить». Free2X Webcam Recorder. Полностью бесплатная программа, которая содержит все необходимые инструменты: Запись с веб-камеры или цифровой камеры. Результат можно сохранить в AVI, MP4, WMV форматах. Скриншоты с сохранением в JPG/BMP. Захват видео с miniDV-камеры на компьютер. Захват видео - это перенос снятого видеоматериала. IP Camera Viewer – программа, которая предоставляет возможность осуществлять видеомониторинг. Установив её, можно просматривать «живую» картинку, получаемую с различных моделей IP-камер и USB веб-камер. Отснятый материал можно сохранять в различных форматах на диск или съемный носитель. Super Webcam Recorder - платная программа, предназначенная для захвата видео, которое транслируется через веб-камеру с последующим сохранением материалов на ПК, съемный диск в форматах WMV и AVI. Более того, утилита делает скриншоты изображения с камеры через определенный временной интервал, который задает пользователь.

Создадим и добавим в проект модуль AviCap32Unit.pas, где опишем внешние функции и константы библиотеки AVICAP32.DLL. Нам понадобятся две функции: capGetDriverDescriptionA и capCreateCaptureWindowA. Для чего они нужны — расскажу позже.

Ещё нам нужны 4 сообщения: WMCAPSTART, WMCAPDRIVERCONNECT, WMCAPGRABFRAME и WMCAPSTOP. Код модуля AviCap32Unit. procedure TMainForm. FormCreate (Sender: TObject );. var i: integer;.

Захват Видео С КамерыЗахват видео с камеры телефона

begin. CamList: =TCamList. Create;.

CamList. Emumerate;. if (CamList.

Count = 0 ) then. begin. ShowMessage ( 'No cams detected!' );. Application. Terminate;.

exit;. end;.

Захват Видео С Камеры Panasonic Через Usb

CamListCB. BeginUpdate;. try. CamListCB. Clear;. for i: = 0 to CamList.

Count - 1 do. CamListCB.

AddObject (CamList i. Name,CamList i );.

CamListCB. ItemIndex: = 0;. finally. CamListCB. EndUpdate;. end;. end; При нажатии на «Старт» — запускаем камеру.

Анализ полученных кадров и определение движения Теперь начинается самое интересное. Пособий о том, как получать изображение с камеры — полным полно в интернете. Нас же интересует определение движения. Скажу вам, что результат захватывает. Для начала — немного теории. Мы будем использовать самый простой, однако, довольно эффективный и наиболее часто используемый метод — сравнение двух соседних кадров. Что же необходимо для этого?

Самый простой метод сравнения — это, конечно, попиксельное вычитание. Нам просто необходимо из каждого пикселя текущего кадра вычесть каждый пиксель предыдущего. Ну, и если разница = 0, то движения не было вовсе. Однако, на камере всегда присутствуют шумы, иногда пролетают мошки, комары. Поэтому мы не будем сравнивать разницу с нулём, а считать, что движение произошло, если модуль разницы меньше константы D Эта константа определяется опытным путём, числа 50 (из 255 возможных для каждого цвета) вполне достаточно.

Захват Видео С Камеры Телефона

Для кадра размером 640x480 и трёх цветов (красный, зелёный, синий) это будет: 640.480.3 = 921600 операций вычитания — почти миллион! И это не раз в секунду, а намного чаще (в идеале - 24 раза, но обычно количество кадров уменьшают до нескольких штук в секунду). Плюс, ещё надо их сравнить. Довольно ресурсоёмко. Именно поэтому картинку приводят к чёрно-белому варианту и уменьшают в несколько раз. Мы каждый кадр тоже будем обесцвечивать и уменьшать (делить) на константу divisor.

Ну, алгоритм ясен:. Получили картинку с камеры;. Привели её к оттенкам серого для каждого пикселя: (R+G+B) div 3;.

Поделили на делитель (например, было 640x480, делитель = 8, итоговый кадр будет 80x60);. Из полученной матрицы отнимаем матрицу, полученную на предыдущем кадре - получаем матрицу разницы ( diff);. Считаем количество элементов diff, значение которых меньше D;. Если количество больше предельного K, то подаём сигнал тревоги. Весь алгоритм реализуем в классе TMotionDetector.

У меня данный эффект не наблюдается, но я часто встречал, что при некоторых настройках ОС бывает 'моргание'. Это происходит потому, что процесс прорисовки картинки занимает некоторое время и этот процесс видим на экране.

Двойная буферизация - это такой приём, при котором изображение сначала рисуется в видеопамяти, которая не отображается на экране, а затем происходит довольно быстрое переключение указателя экрана в этот буфер. Вам следует смотреть в сторону обработчика таймера (CamTimer1Timer). Вероятнее всего грешит Image1.Picture.Assign(bmp); Попробуйте использовать внутренний механизм двойной буферизации Delphi: Image1.Parent.DoubleBuffered:= true; или вручную рисовать на канве с помощью BitBlt. @Роман Сталкивался с таким на некоторых ноутбуках. После 3-4 перезапусков софта заработало. Может быть, у меня какой-то баг?

Я его не нашел. Или же проблема в том, что библиотека AVICAP32.DLL попросту устарела. Программа писалась ещё во времена Windows XP, в семёрке у меня тоже глючит, вот я чуток поправил захват видео - проверьте последние EXE-шки. Если всё будет ок - обновлю исходник.

В серьёзных проектах сейчас используют DirectShow - этот способ удобнее и универсальнее. У меня в планах было разобраться с DirectShow и когда до этого дойдут руки, я обязательно выложу исходник. @Patrik По поводу вашей проблемы читайте мой комментарий. Delphi 7 уже очень сильно устарела, лучше используйте любую более-менее современную версию. По поводу чёрного экрана. Вы кнопку 'Start' нажимали?

Возможно, вы некорректно закрыли устройство в прошлый раз или веб-камера уже используется другими программами? Перезагрузите компьютер и запустите программу 'начисто'. Попробуйте на другом компьютере. Веб камера настроена и работает? Другие программы для работы с камерой работают?

Захват Видео С Камеры Minidv

Какая у вас версия Windows? @Patrik Библиотека AVICAP32 устарела. Я замечал проблемы при неправильном закрытии программы (без кнопки отправки сообщения WMCAPSTOP).

Захват Видео С Камеры Windows 7

Бывали проблемы при повторном открытии программы. Думаю, Microsoft просто 'забила' на поддержку AVICAP32. На MSDN давно уже пишут о проблемах с чёрным экраном на Windows 7 и выше. AVICAP32 - это больше так, поиграться. Серьёзные проекты (типа Skype) используют DirectShow. Опыта использования DirectShow у меня нет. XE3 собирается на раз: dcc32.exe WebCam.dpr -M -B -no-config -$J+,R-,I-,Q-,Y-,B-,A+,W-,U-,T-,H+,X+,P+,V+,G+ -AWinTypes=Winapi.Windows;WinProcs=Win api.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;Generics.Collections=System.Generics.Collections;Generics.Defaults=System.