Собрать устройство, которое способно определять лица на основе Open CV за счет захвата видео с веб-камеры



Содержание

  1. Введение

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

Тогда, велики умы еще в 60-х задумались об наделении ВМ искусственным интеллектом, что в свою очередь послужило зарождению направления в области компьютерного зрения. С тех пор прошло не мало времени и сегодня это уже сформированная самостоятельная дисциплина, благодаря которой компьютеры наделены возможностью видеть, обнаруживать, отслеживать и даже классифицировать различные объекты. Благодаря чему стала активно развиваться робототехника и в целом открываются поистине большие перспективы в области автоматизации.

  1. Постановка задачи

Необходимо разработать и собрать устройство, которое способно определять лица на основеOpenCV за счет захвата видео с веб-камеры со встроенным алгоритмом детектирования лица и отслеживать их с помощью системой слежения на базеArduinoUno и сервоприводов, которые отвечают за координаты X, Y.

  1. Компьютерное зрение
    1. Компьютерное зрение

Компьютерное зрение – это совокупность теория и технологии по созданию машин, которые способны за счет видеопотоков производить обнаружение, отслеживание и классификацию объектов.

На данном этапе развития компьютерных технологиях, КЗ можно считать самой передовой и перспективной технологией.

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

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

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

Основываясь на то, что КЗ является технологической дисциплиной, она стремится применить как теорию, так и технологию это привело к созданию системы КЗ.

Рисунок 1. – Системы компьютерного зрения.

  1. История развитие компьютерного зрения.

КЗ начало активно развиваться к концу 60х годов. В период, когда еще были споры и возможности создать мыслящую вычислительную машину. Вклад в развитие КЗ сделали несколько независимых институтов, связанных с медицинской диагностикой,техническим оснащением компьютера, позже – компьютерной графикой, робототехникой, искусственным интеллектом.

На сегодняшний день существует достаточно большое разнообразие алгоритмов по распознаванию лица, но все они имеют общую структуру:

Рисунок 3.1. – Общая структура распознавания лиц.

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

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

  1. МетодВиолы-Джонса.

Данный метод появился в 2001 г. и является разработкой двух людей Полом Виолой и Майклом Джонсом. Он до сих пор остается эффективным для поиска объектов в реальном времени, как на изображениях, так и на видеопоследовательностях. Стоит отметить тот факт, что этот определитель обладает крайне низкой вероятностью ложного обнаружения лица. Также этот метод способен обнаруживать черты лица под небольшим углом, примерно до 30 градусов. Если угол превышает 30 градусов, в этом случаи возможность обнаружение лица резко падает. Из-за этого недостатка, данный алгоритм неэффективен в современных производственных системах с учетом их растущих потребностей.Данный метод основывается на:

Стандартная задача КЗ это распознавание, где один или несколько предварительно заданных или изученных объектов, классов, которые могут быть распознаны в двумерном положении если речь идет об изображении так и в трехмерном положении на сцене.

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

 В зависимости от освещения, объекты тоже могут претерпевать существенные изменения. Это наглядно видно на рисунке 1, где изображены белые пингвины и глядя на черных пингвинов, сложно догадаться, что это белые. Тем самым мы можем видеть пингвина: черным, серым и белым.

Рисунок 3.2. – Демонстрация освещения.

Размер объектов может варьироваться, причем любых классов. А раз один и тот же объект может иметь разный размер, это вызывает затруднение при определении объекта.

Живые объекты, существенно претерпевают деформацию и перекрывают друг друга. За счет перекрытия, определить объект становится гораздо сложнее.

  1. Разница между человеческим и компьютерным зрением

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

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

Кроме того, человек при распознавании объекта всегда учитывает окружение. Если выдернуть объект из привычного окружения, узнать его станет заметно труднее. Тут тоже играет роль накопленный за жизнь опыт, которого у компьютера нет.

Давайте представим такую задачу, что нам нужно научиться с одного взгляда определять пол одетого человека по фотографии. Для начала нужно определить факторы, которые могут указывать на принадлежность к тому или иному объекту. Помимо этого, нужно собрать еще обучающее множество. Желательно конечно, чтобы оно было репрезентативным. К примеру, возьмем в качестве обучающей выборки всех присутствующих в аудитории. И попробуем на их основе найти отличительные факторы: например, длина волос, наличие бороды, макияжа и одежда (юбка или брюки). Зная, у какого процента представителей одного пола встречались те или иные факторы, мы сможем создать достаточно четкие правила: наличие тех или иных комбинаций факторов с некоей вероятностью позволит нам сказать, человек какого пола на фотографии. Естественно это является условным примером и то что было рассмотрено это лишь поверхностно. В реальных же задачах, которые ставятся перед системами КЗ, факторов гораздо больше. Определять их вручную и просчитывать зависимости – непосильная для человека задача. Поэтому в таких случаях без машинного обучения не обойтись никак.

  1. Программные средства разработки
    1. Программа Microsoft Visual Studio 2012

Microsoft Visual Studio – это новая разработка компании Microsoft, позволяющая создавать приложения, работающие на платформе .net. Особенность этой платформы заключается в широком наборе сервисов, которые доступны в различных языках программирования. При этом сервисы реализуются в виде промежуточного кода, который не зависит от базовой архитектуры. Едва ли не главной целью создания такой платформы было оснащение разработчиков специальными сервисно-ориентированными приложениями, которые могли бы работать на любой платформе, начиная от персонального компьютера и заканчивая мобильным устройством.

Microsoft Visual Studio объединяет в себе огромное количество функций, позволяющих осуществлять разработки для Windows всех версий, в том числе и 8, Интернета, SharePoint, различных мобильных устройств и облачных технологий. В Visual Studio реализуется новая среда разработчика, благодаря которой создавать приложения стало проще. Microsoft Visual Studio - это обновленная и упрощенная программная среда, для которой характерна высокая производительность, причем она не зависит от особенностей оборудования.

Каждая новая версия программы состоит из новейших инструментов и технологий, позволяющих разрабатывать приложения с учетом особенностей и положительных моментов современных платформ. Например, Visual Studio 2012 может поддерживать более ранние версии, в том числе Windows XP и Windows Server 2003. При этом разработчикам открыта дорога к созданию новых и модернизации уже существующих приложений, предназначенных для ранних версий ОС Windows. Стоит отметить, что в процессе использования поддерживаемых системой вариантов исходные файлы, проекты и решения в программе Visual Studio будут работоспособными, но исходный код может нуждаться в изменениях.  Visual Studio Ultimate 2012 представляет собой передовую программу, которая дает возможность любым по размеру командам осуществлять проектирование и создание привлекательных приложений. Благодаря инструментам гибкого планирования можно внедрять методы последовательной разработки и применяться гибкие методологии в темпе, удобном для пользователя.  С помощью расширенных средств моделирования, обнаружения и проектирования можно максимально полно описать систему, которая позволит наиболее удачно реализовать конкретную концепцию архитектуры.

  1. Библиотека Open Source Computer Vision Library

OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.

  1. Программа Arduino IDE

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

  1. Язык программирования С++

Си++ – это компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.другого.

  1. Язык программирования С – 51

C это язык программирования общего назначения, предназначенный для написания программ, эффективных по исполняемому коду, с элементами структурного программирования и богатым набором операторов. Язык программирования C эффективно используется для решения широкого круга задач. Однако при написании программ для микроконтроллеров, принадлежащих к семейству MCS-51, необходимо учитывать особенности построения аппаратуры этих микросхем, поэтому был создан диалект этого языка.

В состав языка программирования С-51 введён ряд изменений, отображающих особенности построения памяти микроконтроллеров семейства MCS-51. Кроме того, эти изменения позволяют непосредственно обращаться к встроенным портам, таймерам и другим устройствам микроконтроллеров указанного семейства. Особенности микроконтроллеров этого семейства в основном отображаются через описания переменных.

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

Компилятор c51.exe – это программное средство, которое транслирует исходный текст, написанный на языке программирования C51 в перемещаемые объектные модули. Компилятор выводит на экран дисплея или в файлы листингов сообщения об ошибках и вспомогательную информацию, которая может быть использована при отладке и разработке программ.

  1. аппаратные и инструментальные средства
    1. Микроконтроллер ATmega328P.

ATmega328P – это 8-ми битныймикроконтроллер,построенный на расширенной архитектуре AVR RISC. Используя команды, исполняемые за один такт, контроллер достигает производительности в 1 MIPS на рабочей частоте 1 МГц, позволяет оптимизировать потребление энергии за счет выбора оптимальной производительности.

Характеристики:

ЯдроAVR сочетает в себе расширенный набор команд с 32 рабочими регистрами которые соединены с АЛУ, тем самым обеспечивая доступ к 2 независимым регистрам на время исполнения команды за 1 такт. За счет такой архитектуры была достигнута высокая производительность, которая превосходит в 10 раз равноценный микроконтроллер CISC.

ATmega328P имеет 32Кбайт программируемую FLASH память, которая дает возможность чтение во время записи, а также позволяет перепрограммировать область программной памяти внутрисистемно через последовательный SPI интерфейс стандартным программатором используя загрузочную программу из энергонезависимой памяти работающую в AVR ядре. 1024 байт именно столько содержится в EEPROM, 2К байт в SRAM, 32 рабочих регистра, JTAG интерфейс сканирования внутренних регистров, встроенную систему отладки и программирования, три гибких таймера - счётчика с модулем сравнения, внутренние и внешние прерывания, последовательный программируемый интерфейс USART, байт-ориентированный двухпроводный последовательный интерфейс, 8 - и канальный, 10 - и битный АЦП с дифференциальным программируемым усилителем который рассчитан исключительно для TQFP, порт SPI с шестью режимами энергосбережения. В режиме Idle ЦПУ не функционирует в то время как функционируют USART, двухпроводный интерфейс, АЦП, SRAM, таймеры -  счётчики, SPI порт и система прерываний. В Atmega328P существует специальный режим подавления шума АЦП, при этом в целом в спящем режиме функционирует только АЦП и асинхронный таймер для уменьшения цифровых шумов преобразования. В выключенном режиме, процессор сохраняет содержимое всех регистров, на время приостанавливает генератор тактовых сигналов и все другие функции кристалла до прихода внешнего прерывания или поступления внешней команды Reset. В режиме ожидания работает один тактовый генератор, при остановке остальных функций контроллера. Благодаря быстрому переходу в нормальный режим работы в том числе и по внешнему прерыванию ATmega328P успешно приспосабливается к внешним условиям работы и требует меньше энергии, чаще оказываясь в режиме Выкл. В расширенном режиме ожидания в рабочем состоянии находятся основной генератор и асинхронный генератор.

При создании микросхемы используется технология Atmel, ее суть заключается в энергонезависимой памяти высокой плотности. Комбинация расширенной 8 - и битной RISC архитектуры ЦПУ и твердотельной FLASH памяти обеспечивают Atmega328P высокую гибкость и экономическую эффективность во встраиваемых системах управления.

Рисунок 5.1. – МикроконтроллерATmega328P, расположение выводов

  1. АналогArduinoUNOR3 на микроконтроллереATmega328P

Аналог Arduino Uno контроллер построен на базе микроконтроллераATmega328P. Arduino это кроссплатформенная система, которая позволяется создавать интересные проекты, не имея особых знаний в области программирования и электротехники, достаточно иметь представление и интерес в данном направлении. На своем борту AUNONO несет 14 цифровых вход/выходов (6 из которых могут использоваться как выходы ШИМ), 6 аналоговых входов, кварцевый генератор 16 МГц, разъем USB, силовой разъем, разъем ICSP и кнопку перезагрузки. Так же в продаже имеется большое количество различных датчиков и дополнительных устройств. В качестве питания можно использовать USB, блок питание (например, от телефона) или запитать от батареи.

Рисунок 5.2. – АналогArduinoUNOR3

Характеристики:

Подробные характеристики микроконтроллераATmega 328P указаны в пункте 5.1

Таблица 5.1. Обозначения выводовArduinoUNO.

Название

Функция

1

VIN

Вход используется для подачи питания от внешнего источника (в отсутствие 5 В от разъема USB или другого регулируемого источника питания). Подача напряжения питания происходит через данный вывод.

2

5V

Регулируемый источник напряжения, используемый для питания микроконтроллера и компонентов на плате. Питание может подаваться от вывода VIN через регулятор напряжения, или от разъема USB, или другого регулируемого источника напряжения 5 В. 

3

3V3

Напряжение на выводе 3.3 В генерируемое встроенным регулятором на плате. Максимальное потребление тока 50 мА.

4

GND

Выводы заземления.

5

ШИМ 3, 5, 6, 9, 10и 11

Любой из выводов обеспечивает ШИМ с разрешением 8 бит

6

SPI: 10 (SS)

Cвязь SPI

7

SPI: 11 (MOSI)

Cвязь SPI

8

SPI: 12 (MISO)

Cвязь SPI

9

SPI: 13 (SCK)

Cвязь SPI

10

LED: 13

Встроенный светодиод, подключенный к цифровому выводу 13. Если значение на выводе имеет высокий потенциал, то светодиод горит

11

A0

Аналоговый вход с разрешением 10 бит

12

A1

Аналоговый вход с разрешением 10 бит

13

A2

Аналоговый вход с разрешением 10 бит

14

A3

Аналоговый вход с разрешением 10 бит

15

A4

Аналоговый вход с разрешением 10 бит

16

A5

Аналоговый вход с разрешением 10 бит

17

I2C: 4 (SDA)и5 (SCL)

Cвязь I2C (TWI)

18

AREF

Опорное напряжение для аналоговых входов.

19

Reset

Низкий уровень сигнала на выводе перезагружает микроконтроллер. Обычно применяется для подключения кнопки перезагрузки на плате расширения, закрывающей доступ к кнопке на самой плате Arduino.

  1. Веб-камера Logitech HD Webcam C525

Портативная среднебюджетная веб-камера Logitech HD Webcam C525 предназначена не только для видеовызовов, но для записи видео в формате высокой четкости с автоматической фокусировкой.

№ 5.3.

Рисунок 5.3. – Веб-камера Logitech HD Webcam C525

Характеристики:

  1. Сервопривод Tower Pro MS 9g SG90

Простой, надежный, аналоговый сервопривод с нейлоновым редуктором.

Рисунок 5.4.– СервоприводSG90

Таблица 5.2. Обозначения выводов сервоприводаSG90.

1

Коричневый провод

Земля ( Ground, подключается к пину GND на плате Arduino )

2

Красный провод

Питание +5 V ( подключается к пину 5V на плате Arduino )

3

Желтый провод

Сигнал управления ( подключается к цифровому пину Arduino )

Характеристики:

Рисунок 5.4.Ноутбук Dell Inspiron 7720 

  1. разработка

В данном дипломном проекте была поставлена задача реализовать устройство, которое сможет определять лицо человека и при его смещении, камера за счет сервоприводов будет подстраиваться под него. Для реализации этой цели, немаловажную роль сыграет ноутбук с подключаемой веб-камерой, который будет отображать картинку и непосредственно определять лицо, таким образом мы получаем компьютерного зрения, которое достаточно часто встречается в нашей жизни. Схема устройства представлена на рисунке № 6.1.

Рисунок 6.1Схема устройства.

Рисунок 6.2Само устройство.

В данном проекте последовательность действий такова:

В начале происходит определение ВК. Также можно выбирать ВК изменяя параметр «cap (1)». В моем случаи это означает, что я выбрал подключенную ВК. Если же поставить 0 (по умолчанию), тогда компьютер выберет первую попавшую камеру (если имеется встроенная камера, выберется она).

VideoCapture cap(1);

if (!cap.isOpened())

{

cout << "exit" <<endl;

return -1;

}

После этого идет подключениеArduino по последовательному порту, с установленной скоростью соединения.

arduino_com = new Tserial();

 if (arduino_com!=0) {

arduino_com->connect("COM3", 57600); }

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

namedWindow(window, 1);

cv::imshow(window, frame);

Для того чтобы алгоритм мог определять лицо, необходимо конвертировать поступающее цветное изображение в серое,

cvtColor(frame, frame_gray, CV_BGR2GRAY);

так как не все алгоритмы способны работать с цветным изображением.

Далее задействуется алгоритм определения лица.

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

Когда лицо определяется оно обрисовывается квадратом, это наглядно видно рисунке 6.3,

Рисунок 6.3 – Лицо определилось.

После того как лицо определилось, устанавливается центр его положения.

Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );

Затем при отклонении от центра, как показано на рисунке 6.4, высчитывается по координатам в какою именно сторону оно отклонилось и через последовательный порт посылается сигнал наArduino.

LSB = faces[i].x & 0xff;

    MSB = (faces[i].x >> 8) & 0xff;

arduino_com->sendChar( MSB );

arduino_com->sendChar( LSB );

LSB = faces[i].y & 0xff;

MSB = (faces[i].y >> 8) & 0xff;

arduino_com->sendChar( MSB );

arduino_com->sendChar( LSB );

posx = servox.read();

   posy = servoy.read();

Рисунок 6.4– Лицо сместилось в сторону.

В свою очередь,Arduino считывает полученные сигналы и непосредственно начинает взаимодействовать с сервоприводами.

MSB = Serial.read();

   delay(5);

   LSB = Serial.read();

   MSBLSB=word(MSB, LSB);

   valx = MSBLSB;

   delay(5);

   MSB = Serial.read();

   delay(5);

   LSB = Serial.read();

   MSBLSB=word(MSB, LSB);

   valy = MSBLSB;

   delay(5);

   posx = servox.read();

   posy = servoy.read();

   servox.write(posx);

   servoy.write(posy);

Рисунок 6.5 – AUNO подстроило камеру по центру.

В результате, как видно на рисунке 6.5AUNO удачно подстроил веб-камеру по центру лица.

За отображение информации в верхнем правом угу, отвечает  данный участок кода:

cv::putText(frame, "Frames: " + frameset, cvPoint(30, 30), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(0, 255, 0), 1, CV_AA);

  cv::putText(frame, "Faces Detected: " + faceset, cvPoint(30, 60), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(0, 255, 0), 1, CV_AA);

  cv::putText(frame, "Resolution " + wi + " x " + he, cvPoint(30, 90), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(0, 255, 0), 1, CV_AA);

  1. Заключение

В процессе разработки дипломного проекта была изучена предметная область, библиотекаOpenCV. Узнал историю развития данной технологии, ознакомился сметодомВиолы-Джонса, который в моем проекте отвечает за определение лица человека. Непосредственно был приобретен опыт работы с данной библиотекой и мощным инструментом разработкиMicrosoftVisualStudio. Получил навык работы сArduinoUNO и его средой разработки, была разработана схема, выбраны компоненты и изучена архитектура микроконтроллера Atmega328P. Самое главное был получен опыт в реализации компьютерного зрения.

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

Приложение А

(справочное)

Библиография

  1. Компьютерное зрение. Современный подход Дэвид А. Форсайт, Жана
  2. Алгоритмы обнаружения лица человека для решения прикладных задач анализа и обработки изображений. Кудряшов, Павел ПавловичИзмерение, управление и регулирование с помощью AVR микроконтроллеров. Трамперт В.
  3. Обнаружение и локализация лица на изображении. Владимир Вежневец Анна ДегтяреваПрименение Микроконтроллеров AVR: схемы алгоритмы программы. Баранов В.Н.
  4. Learning OpenCV Gary Bradski, Adrian KaehlerМикроконтроллеры AVR в радиолюбительской практике. Белов А.В.
  5. Переход к Microsoft Visual Studio 2010 Патрис Пелланд, Паскаль Паре, Кен ХайнсСоздаем устройства на микроконтроллерах. Белов А.В.
  6. Визильтер Ю.В. Желтов С.Ю. Князь В.А. и др. Обработка и анализ цифровых изображений с примерами на LabVIEW и IMAQ Visionэлектрические измерения и приборы. 3.1. Роль измерений в электротехнике.URL:http://www.kipia.info/bibliotek/elektrotehnika-i-elektronika-(-uchebnoe-posobie-dlya-vuzov)/glava-3-elektricheskie-izmereniya-i-priboryi/(08.06.2016).
  7. Компьютерное зрениеURL:https://ru.wikipedia.org/wiki/Компьютерное_зрение (09.06.2016).
  8. Выделение и распознование лицURL:http://wiki.technicalvision.ru/index.php/Выделение_и_распознавание_лиц (09.06.2016).
  9. Введение в компьютерное зрениеURL:http://www.slideshare.net/ktoshik/cv2015-01-introimage.(09.06.2016).
  10. The OpenCV Tutorials URL: http://docs.opencv.org/2.4/opencv_tutorials.pdf (09.06.2016).

Приложение Б

(рекомендуемое)

Наиболее употребляемые текстовые сокращения

КЗ – компьютерное зрение

ВК – веб-камера

СП – сервопривод

ПК – персональный компьютер

МЗ – машинное зрение

  ШИМ– широтно-импульсная модуляция.

  AUNONO – Arduino UNO

Приложение В

(рекомендуемое)

Листинг

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

#include "Tserial.h"

using namespace std;

using namespace cv;

void detectAndDisplay( Mat frame );

String face_cascade_name = "haarcascade_frontalface_alt.xml";

String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";

CascadeClassifier face_cascade;

CascadeClassifier eyes_cascade;

string window_name = "Capture - Face detection - Remixed by TechBitar";

 int arduino_command;

 Tserial *arduino_com;

 short MSBLSB = 0;

 unsigned char MSB = 0;

 unsigned char LSB = 0;

int main( int argc, const char** argv )

{

 CvCapture* capture;

 Mat frame;

 arduino_com = new Tserial();

 if (arduino_com!=0) {

      arduino_com->connect("COM7", 57600, spNONE); }

 if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };

 if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };

  capture = cvCaptureFromCAM( 3 );

 if( capture )

 {

   while( true )

   {

     frame = cvQueryFrame( capture );

     if( !frame.empty() )

      { detectAndDisplay( frame ); }

     else

      { printf(" --(!) No captured frame -- Break!"); break; }

     int c = waitKey(10);

     if( (char)c == 'c' ) { break; }

   }

 }

    arduino_com->disconnect();

    delete arduino_com;

    arduino_com = 0;

 return 0;

}

void detectAndDisplay( Mat frame )

{

  std::vector<Rect> faces;

  Mat frame_gray;

  cvtColor( frame, frame_gray, CV_BGR2GRAY );

  equalizeHist( frame_gray, frame_gray );

  face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

  for( int i = 0; i < faces.size(); i++ )

   {

     Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );

     ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );

 cout << "X:" << faces[i].x  <<  "  y:" << faces[i].y  << endl;

    LSB = faces[i].x & 0xff;

    MSB = (faces[i].x >> 8) & 0xff;

 arduino_com->sendChar( MSB );

 arduino_com->sendChar( LSB );

LSB = faces[i].y & 0xff;

MSB = (faces[i].y >> 8) & 0xff;

arduino_com->sendChar( MSB );

arduino_com->sendChar( LSB );

     Mat faceROI = frame_gray( faces[i] );

     std::vector<Rect> eyes;

   }

  imshow( window_name, frame );

}

тсериал

#ifndef TSERIAL_H

#define TSERIAL_H

#include <stdio.h>

#include <windows.h>

enum serial_parity  { spNONE,    spODD, spEVEN };

class Tserial

{

protected:

   char              port[10];

   int               rate;

   serial_parity     parityMode;

   HANDLE            serial_handle;

public:

                 Tserial();

                ~Tserial();

   int           connect          (char *port_arg, int rate_arg,

                                   serial_parity parity_arg);

   void          sendChar         (char c);

   void          sendArray        (char *buffer, int len);

   char          getChar          (void);

   int           getArray         (char *buffer, int len);

   int           getNbrOfBytes    (void);

   void          disconnect       (void);

};

#endif TSERIAL_H

#define STRICT

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <process.h>

#include <conio.h>

#include <windows.h>

#include "Tserial.h"

Tserial::Tserial()

{

   parityMode       = spNONE;

   port[0]          = 0;

   rate             = 0;

   serial_handle    = INVALID_HANDLE_VALUE;

}

Tserial::~Tserial()

{

   if (serial_handle!=INVALID_HANDLE_VALUE)

       CloseHandle(serial_handle);

   serial_handle = INVALID_HANDLE_VALUE;

}

void Tserial::disconnect(void)

{

   if (serial_handle!=INVALID_HANDLE_VALUE)

       CloseHandle(serial_handle);

   serial_handle = INVALID_HANDLE_VALUE;

}

int  Tserial::connect          (char *port_arg, int rate_arg, serial_parity parity_arg)

{

   int erreur;

   DCB  dcb;

   COMMTIMEOUTS cto = { 0, 0, 0, 0, 0 };

   if (serial_handle!=INVALID_HANDLE_VALUE)

       CloseHandle(serial_handle);

   serial_handle = INVALID_HANDLE_VALUE;

   erreur = 0;

   if (port_arg!=0)

   {

       strncpy(port, port_arg, 10);

       rate      = rate_arg;

       parityMode= parity_arg;

       memset(&dcb,0,sizeof(dcb));

       dcb.DCBlength       = sizeof(dcb);

       dcb.BAUNOdRate        = rate;

       switch(parityMode)

       {

           case spNONE:

                           dcb.Parity      = NOPARITY;

                           dcb.fParity     = 0;

                           break;

           case spEVEN:

                           dcb.Parity      = EVENPARITY;

                           dcb.fParity     = 1;

                           break;

           case spODD:

                           dcb.Parity      = ODDPARITY;

                           dcb.fParity     = 1;

                           break;

       }

       dcb.StopBits        = ONESTOPBIT;

       dcb.ByteSize        = 8;

       dcb.fOutxCtsFlow    = 0;

       dcb.fOutxDsrFlow    = 0;

       dcb.fDtrControl     = DTR_CONTROL_DISABLE;

       dcb.fDsrSensitivity = 0;

       dcb.fRtsControl     = RTS_CONTROL_DISABLE;

       dcb.fOutX           = 0;

       dcb.fInX            = 0;

       dcb.fErrorChar      = 0;

       dcb.fBinary         = 1;

       dcb.fNull           = 0;

       dcb.fAbortOnError   = 0;

       dcb.wReserved       = 0;

       dcb.XonLim          = 2;

       dcb.XoffLim         = 4;

       dcb.XonChar         = 0x13;

       dcb.XoffChar        = 0x19;

       dcb.EvtChar         = 0;

       serial_handle    = CreateFile(port, GENERIC_READ | GENERIC_WRITE,

                              0, NULL, OPEN_EXISTING,NULL,NULL);

       if (serial_handle    != INVALID_HANDLE_VALUE)

       {

           if(!SetCommMask(serial_handle, 0))

               erreur = 1;

           if(!SetCommTimeouts(serial_handle,&cto))

               erreur = 2;

           if(!SetCommState(serial_handle,&dcb))

               erreur = 4;

       }

       else

           erreur = 8;

   }

   else

       erreur = 16;

   if (erreur!=0)

   {

       CloseHandle(serial_handle);

       serial_handle = INVALID_HANDLE_VALUE;

   }

   return(erreur);

}

void Tserial::sendChar(char data)

{

   sendArray(&data, 1);

}

void Tserial::sendArray(char *buffer, int len)

{

   unsigned long result;

   if (serial_handle!=INVALID_HANDLE_VALUE)

       WriteFile(serial_handle, buffer, len, &result, NULL);

}

char Tserial::getChar(void)

{

   char c;

   getArray(&c, 1);

   return(c);

}

int  Tserial::getArray         (char *buffer, int len)

{

   unsigned long read_nbr;

   read_nbr = 0;

   if (serial_handle!=INVALID_HANDLE_VALUE)

   {

       ReadFile(serial_handle, buffer, len, &read_nbr, NULL);

   }

   return((int) read_nbr);

}

int Tserial::getNbrOfBytes    (void)

{

   struct _COMSTAT status;

   int             n;

   unsigned long   etat;

   n = 0;

   if (serial_handle!=INVALID_HANDLE_VALUE)

   {

       ClearCommError(serial_handle, &etat, &status);

       n = status.cbInQue;

   }

   return(n);

}

#include <Servo.h>

#define  servomaxx   180

#define  servomaxy   180

#define  screenmaxx   320

#define  screenmaxy   240

#define  servocenterx   90

#define  servocentery   90

#define  servopinx   9

#define  servopiny   10

#define  bAUNOdrate 57600

#define distancex 1

#define distancey 1

int valx = 0;

int valy = 0;

int posx = 0;

int posy = 0;

int incx = 10;

int incy = 10;

Servo servox;

Servo servoy;

short MSB = 0;

short LSB = 0;

int   MSBLSB = 0;

void setup() {

 Serial.begin(bAUNOdrate);

 Serial.println("Starting Cam-servo Face tracker");

 pinMode(servopinx,OUTPUT);

 pinMode(servopiny,OUTPUT);

 servoy.attach(servopiny);

 servox.attach(servopinx);

 servox.write(servocenterx);

 delay(200);

 servoy.write(servocentery);

 delay(200);

}

void loop () {

 while(Serial.available() <=0);

 if (Serial.available() >= 4)

 {

   MSB = Serial.read();

   delay(5);

   LSB = Serial.read();

   MSBLSB=word(MSB, LSB);

   valx = MSBLSB;

   delay(5);

   MSB = Serial.read();

   delay(5);

   LSB = Serial.read();

   MSBLSB=word(MSB, LSB);

   valy = MSBLSB;

   delay(5);

   posx = servox.read();

   posy = servoy.read();

   if(valx < (screenmaxx/2 - incx)){

     if( posx >= incx ) posx += distancex;

   }

   else if(valx > screenmaxx/2 + incx){

     if(posx <= servomaxx-incx) posx -=distancex;

 }

   if(valy < (screenmaxy/2 - incy)){

     if(posy >= 5)posy += distancey;

   }

   else if(valy > (screenmaxy/2 + incy)){

     if(posy <= 175)posy -= distancey;

   }

   servox.write(posx);

   servoy.write(posy);

}

}




Похожие работы, которые могут быть Вам интерестны.

1. Устройство подсчета количества нажатий на кнопку SB0 за каждые 15 с на основе микроконтроллера ATmega 8

2. Разработка конструкции камеры-холодильника и технологического процесса изготовления его отдельных составных частей

3. Механизм захвата манипулятора

4. Обработка результатов многократных измерений в программе Open Office

5. РАЗРАБОТКА ДИНАМИЧЕСКОГОWEB-САЙТА С ПРИМЕНЕНИЕМ OPEN SOURCE СИСТЕМ УПРАВЛЕНИЯ КОНТЕНТОМ (CMS)

6. Убийство, которое было совершено из корыстных побуждений

7. РАЗРАБОТКА НАСТУПАТЕЛЬНОЙ СТРАТЕГИИ ЗАХВАТА НЕЗАНЯТЫХ ПРОСТРАНСТВ

8. Выбор оптимального судна, которое будет эксплуатироваться на заданной линии

9. Создание видео игры змейка

10. УГОЛОВНО-ПРАВОВАЯ ХАРАКТЕРИСТИКА ЗАХВАТА ЗАЛОЖНИКА ПО ДЕЙСТВУЮЩЕМУ ЗАКОНОДАТЕЛЬСТВУ РОССИЙСКОЙ ФЕДЕРАЦИИ