Пояснительная записка Студент Чехолдин А. В



Скачать 293,07 Kb.
Дата26.10.2016
Размер293,07 Kb.
Федеральное агентство связи

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Сибирский государственный университет телекоммуникаций и информатики»

(СибГУТИ)










Кафедра

вычислительных систем

Допустить к защите







Зав.каф. ____________Мамойленко С.Н.









ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА БАКАЛАВРА

Устройство слежения за лицом

Пояснительная записка





Студент

Чехолдин А.В.

/…………………/










Факультет

ИВТ

Группа

ИУ-323



Руководитель


Гонцова А.В.


/ …………..……/
































Новосибирск 20__ г.

Содержание



1Введение 3

2Постановка задачи 4

3Компьютерное зрение 5

3.1Компьютерное зрение 5

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

3.3Общая структура распознавания лица. 7

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

3.5Задачи компьютерного зрения. 8

3.6Компьютерное зрение – это сложно 8

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

4Программные средства разработки 11

4.1Программа Microsoft Visual Studio 2012 11

4.2Библиотека Open Source Computer Vision Library 11

4.3Программа Arduino IDE 12

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

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

5аппаратные и инструментальные средства 13

5.1Микроконтроллер ATmega328P. 13

5.4Сервопривод Tower Pro MS 9g SG90 18

5.5Ноутбук Dell inspiron 7720 19

6разработка 20

7Заключение 26




1Введение


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

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




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


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


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

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


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

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

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

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

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

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



скз

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


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


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

1955 г. - профессор МТИ Оливер Селфридж опубликовал статью «Глаза и уши для компьютера». В ней он предложил идею оснащать компьютеры средствами, за счет которых, он бы смог распознавать звуки и изображения.

1958 г. - психолог Фрэнк Розенблатт из Корнеллского университета изобрел персептрона (от perception - восприятие) - устройства, которое моделирует схему восприятия информации человеческим мозгом и смоделировал его на ЭВМ IBM-704.

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

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

1979 г. - профессор Ганс-Хельмут Нагель из Гамбургского университета стал основоположником теории анализа динамических сцен, которые позволяли распознавать движущиеся объекты в видеопотоке.5. 1979 г. - профессор Ганс-Хельмут Нагель из Гамбургского университета стал основоположником теории анализа динамических сцен, которые позволяли распознавать движущиеся объекты в видеопотоке.

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

Начало 1990-х, Была предложена модульная парадигма Д. Марром, которая основывалась на длительном изучения механизмов зрительного восприятия человека, от так же утверждает, что обработка изображений должна опираться на последовательность уровней восходящей информационной линии: от «иконического» представления объектов в виде растрового изображения – к их символическому представлению в виде реляционных структур, векторных данных и т.п.

2003 г. появление надежных систем распознавания лиц.

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


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

схема разспознования

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



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

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

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


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

  • Интегральном представлении, за счет чего происходит быстрое объектов.

  • Признаках Хаара, с помощью которого производится поиск конкретного объекта.

  • Бустинге, который отвечает за выбор наиболее подходящих признаков для искомого объекта на данной части изображения.

  • Классификаторе, на вход которого поступают все признаки, после чего даёт результат «верно» либо «ложь».

  • Каскадных признаках. Основывается на быстром отбрасывании окон, в местах где не удалось обнаружить лицо.

3.5Задачи компьютерного зрения.


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

Идентификация: распознавание индивидуальных экземпляров объектов. Например, идентификация определенного человека либо автомобиля.

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

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

Оценка положения: это ориентация конкретного объекта относительно камеры.

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


3.6Компьютерное зрение – это сложно


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

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

c:\users\alexandr\appdata\local\microsoft\windows\inetcache\content.word\пингвины.png

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



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

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

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


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

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

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

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

4Программные средства разработки

4.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 представляет собой передовую программу, которая дает возможность любым по размеру командам осуществлять проектирование и создание привлекательных приложений. Благодаря инструментам гибкого планирования можно внедрять методы последовательной разработки и применяться гибкие методологии в темпе, удобном для пользователя.
С помощью расширенных средств моделирования, обнаружения и проектирования можно максимально полно описать систему, которая позволит наиболее удачно реализовать конкретную концепцию архитектуры.

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


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

4.3Программа Arduino IDE


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

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


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

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


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

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

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

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


5аппаратные и инструментальные средства

5.1Микроконтроллер ATmega328P.


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

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

Высокопроизводительный, 8-ми битный процессор

Развитая RISC архитектура

131 исполняемых команд, большинство которых выполняются за один такт

32 рабочих регистра общего назначения

статический режим работы - полностью

производительность составляет при 20 МГц до 20 MIPS

установлен 2-х тактовый умножитель

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

имеется внутрисистемно самопрограммируемая 32К байтная FLASH памяти с количеством циклов перепрограммирования до10 000.

EEPROM составляет 1024 байт с допустимым количеством циклов стирания записи до 100 000.

SRAM составляет 2К байт

программируемый ключ защиты программ

JTAG

Сканирование памяти стандартом JTAG



Встроенная поддержка отладчика

Программирование FLASH, EEPROM производится через JTAG интерфейс

Периферийные функции

два 8-битных и один 16-битный таймера/счётчика с программируемым предделителем, режимом сравнения и захвата

счётчик реального времени с программируемым генератором

8-и канальный, 10-и битный АЦП

Специальные функции

Master/Slave SPI последовательный интерфейс

четыре ШИМ генератора

байт- ориентированный, двухпроводный интерфейс

программируемый USART

Программируемыи Watchdog таймер с программируемым генератором

Встроенный аналоговый компаратор

Reset по включению питания и выключение при снижении напряжения питания

Внутренний калиброванный RC генератор

Внешние и внутренние источники прерывания

6 экономичных режимов: Idle, подавления шумов АЦП, экономичный, режим Выкл., режимы ожидания и расширенного ожидания.

23 программируемых вывода вход-выход и 1 вход

28 выводной корпус PDIP, 32 выводной корпус TQFP, и 32 контактный QFN/MLF

Напряжение питания:

1.8 В до 5.5 В

Тактовая частота:

0-20 МГц
Ядро 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 высокую гибкость и экономическую эффективность во встраиваемых системах управления.

atmega328p-au_pin-out-diagram

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



    1. Аналог Arduino UNO R3 на микроконтроллере ATmega328P

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

img_3282

Рисунок 5.2. – Аналог Arduino UNO R3

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


  • Микроконтроллер: ATmega328

  • Рабочее напряжение: 5 В

  • Входное напряжение (рекомендуемое) : 7-12 В

  • Входное напряжение (предельное) : 6-20 В

  • Цифровые Входы/Выходы: 14 (6 из которых могут использоваться как выходы ШИМ)

  • Аналоговые входы: 6

  • Постоянный ток через вход/выход: 40 мА

  • Постоянный ток для вывода: 50 мА

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

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





Название

Функция

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.


i

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

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


  • Матрица (Мп) : 1.3

  • Разрешение (видео) : 1280x720

  • Микрофон : встроенный

  • Технология Logitech Fluid Crystal


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


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

c:\users\alexandr\appdata\local\microsoft\windows\inetcache\content.word\sg90servo-550x530.jpg

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

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


1

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

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

2

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

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

3

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

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

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



  • Рабочая скорость: 0.12sec / 60 градусов

  • Блокирующий момент: 1.2кг/см (4.8В); 1.6кг/см (6.0В)

  • Рабочее напряжение: 3-7.2В

  • Температурный диапазон: 30-60

  • Размер: 22мм х 11.5мм х 27мм

  • Вес: 9г

  • Длина провода: 20 см
    1. Ноутбук Dell inspiron 7720


Отличная вычислительная мощность. В основе производительности модели заложен четырех ядерный процессор Intel Core i7 3630QM с тактовой частотой 2,4 ГГц, а также оперативная память DDR3 объемом 8 Гб и дискретный видеокартой NVIDIA GeForce 650M, идеальный подходит для просмотра широкоформатных фильмов, игр и различных мультимедийных приложений. Для хранения информации имеется большой резерв памяти емкость которого составляет один терабайт.

Хороший экран. Его размер составляет 17,3-дюймовый с разрешением 1920х1080, со встроенной светодиодной подсветкой, тем самым обеспечивая достойное качество при просмотре высококачественного видеоконтента.

Для удобства пользователя. В этой машине все продумано до мелочей. Четыре встроенных в ноутбук Dell Inspiron 7720 разъема USB 3.0 обеспечат быстрый обмен данными с совместимыми носителями, интерфейс HDMI позволит подключиться к HD-монитору или плазменной панели для просмотра фильмов формата Full HD, модуль Bluetooth даст возможность подсоединить беспроводные наушники, а сетевой модуль Wi-Fi создаст комфорт пользования беспроводным Интернетом в любом месте, где имеется доступ к сигналу Wi-Fi.

c:\users\alexandr\appdata\local\microsoft\windows\inetcache\content.word\dell.jpg

Рисунок 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,



д1

Рисунок 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();



д2

Рисунок 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);






д3

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

В результате, как видно на рисунке 6.5 AUNO удачно подстроил веб-камеру по центру лица.
За отображение информации в верхнем правом угу, отвечает данный участок кода:


  1. 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);

    Заключение


В процессе разработки дипломного проекта была изучена предметная область, библиотека OpenCV. Узнал историю развития данной технологии, ознакомился с методом Виолы-Джонса, который в моем проекте отвечает за определение лица человека. Непосредственно был приобретен опыт работы с данной библиотекой и мощным инструментом разработки Microsoft Visual Studio. Получил навык работы с Arduino UNO и его средой разработки, была разработана схема, выбраны компоненты и изучена архитектура микроконтроллера 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).

Приложение Б


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

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



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

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

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

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

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

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



AUNONOArduino UNO

Приложение В


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

Листинг


#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"
#include

#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 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 eyes;

}

imshow( window_name, frame );


}

тсериал


#ifndef TSERIAL_H

#define TSERIAL_H


#include

#include

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

#include

#include

#include

#include

#include
#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
#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);

}

}


Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©grazit.ru 2017
обратиться к администрации

    Главная страница