Делаем детектор движения на основе веб-камеры

Хочу рассказать вам о том, как без особых затрат создать программу, которая при должной доработке может стать еще одним рубежом зашиты вашего жилища.
Я говорю про детектор движения, состоящий из двух частей — веб-камеры (или любого другого подобного устройства) и программы, которая возьмет на себя функции детектора движения, оповещателя и др.

Для затравки предлагаю посмотреть на несколько более продвинутый вариант, который получился у меня - анимиция GIF.
 

Для создания программы необходимо иметь под рукой Delphi\C++ Builder и компоненты VisionLab.
В статье я опишу реализацию основных функций, которые необходимы для такого рода программы. Само-собой, что для создания детектора, в точности удовлетворяющего вашим нуждам, понадобятся навыки работы с рассматриваемыми IDE.

Проще говоря, я покажу насколько легко можно сделать детектор движения, но детальной инструкции по написанию полноценной программы не дам, т.к. это выходит далеко за рамки одной статьи.

При написании статьи я использовал C++ Builder 6, но все написанное очень легко адаптировать не только под другую версию билдера, но и под Delphi. На установке компонентов останавливаться не буду, т.к. она практически ничем не отличается от установки любой другой программы. Сами компоненты можно найти на сайте http://mitov.com/

Итак, поехали. Запускаем билдер, создаем новый проект
File | New | Application

На экране появится пустая форма, на которую из вкладок VisionLab переносим компоненты:
VLDSCapture
VLMotionDetect
VLImageDisplay (2 экземпляра)

Вы можете изменить размер формы и передвигать компоненты по ней так, как захотите. У меня форма выглядела так:

Теперь нам необходимо настроить компоненты. Для этого выделяем VLDSCapture1 (просто кликнув на него) и в окошке "Object Inspector" ищем свойство OutputPin.
Кликаем на кнопку с тремя точками.

Вы увидите вот такой диалог:

Расставьте чекбоксы как показано на картинке и нажмите OK.

Выделяем VLMotionDetect1. В окошке "Object Inspector" снова ищем свойство OutputPin и кликаем на кнопку с тремя точками.

В открывшемся диалоге расставляем чекбоксы как показано на картинке и кликаем OK.

Скомпилируйте свою программу (F9). Когда приложение запустится, вы увидите 2 окошка, одно из которых показывает видео с камеры, а второе - последний кадр, на котором было замечено движение.

Поздравляю, вы только что создали детектор движения на основе веб-камеры! Теперь добавим ему новых возможностей.

Настройка чувствительности детектора
Дважды кликнув на VLMotionDetect1, вы откроете следующий редактор:

Вы можете изменить размер поля, что повлияет на общую чувствительность детектора, а также задать чувствительность каждой ячейки, выделив ее, и нажав 0-9.

Такой способ не подходит для постоянного использования, поэтому добавим возможность управлять чувствительностью во время выполнения программы, написав нашу первую(!) строчку кода в этой программе.

Для этого на вкладке Standard палитры компонентов найдем и перенесем на форму компонент Button. Это простая кнопка, которую все пользователи ПК видели не один раз. Выделив кнопку на форме, можно в окошке Object Inspector изменить надпись на ней (свойство Caption).

  • Му уже не один раз редактировали свойства компонентов с помощью окошка Object Inspector, поэтому в дальнейшем, говоря "отредактируйте свойство", я буду подразумевать редактирование через Object Inspector. Также напоминаю, что редактирование свойств компонентов, подразумевает его обязательное выделение кликом, перед началом работы.
  • Дважды кликните на созданную кнопку, открыв редактор. В обработчике события (TForm1::Button1Click), между фигурных скобок, должен располагаться код, который выполнится, когда будет нажата кнопка. Запишем в него следующий код

    VLMotionDetect1->MotionGrid->ShowDialog();

    Т.о. исходный код должен выглядеть так:

    Скомпилируйте свою программу (F9) и нажмите кнопку. Вы увидите уже знакомый диалог настройки чувствительности детектора.

    Лог
    Теперь добавим возможность сохранять данные о квадратах, в которых было замечено движение.

    С вкладки Standard палитры компонентов переносим на форму компонент Memo.
    Измените его свойство ScrollBars, установив значение в ssVertical

    Отредактировать содержимое окна по-умолчнию можно используя свойство Lines

    Выделите, кликнув на него, компонент VLMotionDetect1 и измените свойство SynchronizeType, установив его в stQueue
    Не закрывайте Object Inspector, а перейдите на вкладку Events.

    Дажды кликните на событие OnMotionDetect.
    Откроется редактор кода, в котором, как я уже говорил, между фигурных скобок должен располагаться код, котрый выполнится во время выбранного события(в нашем случае - при обнаружении движения).
    Вставим туда следующий код:
    Memo1->Lines->Add( "Движение в квадрате "+IntToStr(ACell.x)+","+IntToStr(ACell.y) );

    Т.о. исходный код будет выглядеть таким образом:

    Скомпилируйте свою программу (F9). Когда приложение запустится, вы увидите что теперь программа сообщает о квадрате, в котором было замечено движение.

    Безусловно, такая программа требует доработки. И первое, что на мой взгляд нужно сделать - так это добавить сохранение скриншотов, запись видео, возможность выгрузки данных по FTP и пр. Но реализация этих функций выходит за рамки моей статьи.

    Например, у меня получилась такая программа.

    • Категории:

    Комментарии

    Здоровско! Уважаю таких программистов!

    выложи компоненты где нибудь
    а то с сайта не скачиваются

    Конкретно для C++ Builder\Delphi см. ссылку ниже

    какой ты праграмерб на гатовых компонентх всё делаеш....

    Ололо, реальне, следует делать программы на машине Тьюринга, выполненной из дерева, рубанком и топором.
    Вот это да! Ручная работа, изящество реализации, Искусство! А перфокарты и все прочие методы, позволяющие не изобретать велосипед, в топку, это стыд и срам.

    Вы небось еще думаете, что охотник, который убивает медведя с помощью ружья и лаек - не нестоящий. Настоящий охотник только тот, кто рвет медведю пасть голыми руками ;)

    Короче, коммент сохраню на память о первом толстом тролле в моем блоге.

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

    Это не коммент, а подмена понятий.

    Винапи тоже нельзя юзать? Даже инвокабельный синтаксис масма? Где граница, что можно использовать, а что нет?

    Правильно написано ниже, странное у вас понятие о профессии.

    странно, но во вкладке Video Lab нет компонента VLMotionDetect (Delphi7) :(

    понятно почему, в комментах не та ссылка, качать по этой http://www.mitov.com/VisionLab_VCL_4_5.zip

    Спасибо, что исправили, я дал неправильную ссылку.

    Не за что, если возможности подскажите, как сохранить изображение из VLDSImageDisplay?

    Как напрямую достучаться да пикчи не знаю, под рукой нет компонентов, чтобы установить и посмотреть. Но можно так:

    1) На форму добавить TImage

    2) В обработчике события ProcessData для VLGenericFilter добавить:

    InBuffer.ToBitmap( Image1->Picture->Bitmap );
    Image1->Refresh();

    3) Сохранение скриншота в JPEG:

    TJPEGImage *jp;
    jp = new TJPEGImage();
     
    try
    {
    	jp->Assign(Image1->Picture->Bitmap);
    	jp->SaveToFile(fname);
    }
    __finally
    {
    	delete jp;
    }

    спасибо )

    Использовать полностью готовый инструмент и написать к нему 3 строчки кода. Какое же это программирование? Стыдно называться программистом, позорить великую профессию. Назови статью правильно "Как используя готовый компонент и всего 3 строчки кода сделать детектор движения"

    Программистам такие уроки ни к чему.
    Или надо было для новичков сделать урок на DirectShow+STL?
    Короче, перечитайте, дабы ухватить тезис.

    Та не обращайте внимание на тупорезов, эта программа делается в визуальной среде, зачем писать свой компоненты если они уже сделаны, нахера тратить время если решить задачу можно с помощью компонентов зарание уже сделаными, сдесь работа идет с визуальным языком, а если вы собрались писать каждую кнопку, каждую форму, компонент, то вы дядя дебил)

    Спасибо за статью и наводку на компоненты.
    PS. У некоторых действительно странное представление о программистах, профессии и позоре.

    Согласен, автор действительно молодец и делает интересные и полезные вещи =)
    Соглашусь и с тем что он дает наводки на определенные вещи и отвечает на вопросы пользователей. Причем грамотно и достаточно своевременно. За что ему большая благодарность.
    А что касаемо "странных" людей, так это люди "залетные". К программированию никакого отношения не имеют, да и слушать таких полудурков точно не стоит. (И тут согласился... Вот блин...)
    Автор, помни про мои вопросы о парсере, они очень для меня важны! =)

    После запуска откомпилированной программы дважды появляется ошибка 0xc0000005 и она завершается - в чем может быть дело, Админь Мой)))?

    И дело не в DEP((((

    Админь, Вы что-то не выходите на связь(( Буду надеяться, что с Вами все в порядке

    Я так понимаю это только в бильдере можно делать? А в visual studio?

    Вроде на mitov.com били пакеты для студии? Хотя может меня глючит, давно все это было.

    А подскажите как сделать, чтобы при фиксировании движения начиналась запись видео на жёсткий диск?

    Нужно обрабатывать MotionDetect

    А что ездить на телеге лучше чем на новой мазде?? А ведь телегу тоже дорабатывали, используя общую идею движения. Разве в жизни мало вещей на которые люди смотрят по новому и находят им новое применение???
    Парняга молодец!!! если расширенно смотрит на то, что есть под рукой и находит новое применение этому... А если у вас другой взгляд на происходящее, то прежде чем выразить его подумайте а надо ли? Пусть он делает все лишь бы от этого была польза !!! Кулибины, рукастые еще есть...

    А можно через эти компоненты отслеживать изменение участка экрана монитора?

    Как узнать значение FPS(сколько кадров в секунду) в этих компонентах?

    Добавить комментарий

    Адрес показан не будет
    CAPTCHA
    Антибот
    Как оформить комментарий?