Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Курсова робота
з дисципліни: Технології об’єктно-орієнтованого програмування
на тему: "Пошук об'єктів в відео потоці із допомогою бібліотеки комп'ютерного бачення OpenCV"
Завдання на курсову роботу
Тема курсового проекту називається "Пошук об'єктів в відео потоці із допомогою бібліотеки комп'ютерного бачення OpenCV".
Даний завдання виконано із допомогою мови програмування С++, в середовищі програмування Visual Studio 2013. Вибрано такі інструменти розробки, тому що вони є безкоштовними для користування. С++ має повністю відкритий код, і при правильному підході відкриває більше можливостей у написанні коду ніж інші об'єктно-орієнтовані програмування. Visual Studio дозволяє легко і якісно підключити бібліотеки для використання.
С++ — мова програмування високого рівня з підтримкою декількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Кросплатформність, широкій набір сторонніх бібліотек з відкритим кодом, дещо менша комерційна підтримка
Microsoft Visual Studio — серія продуктів фірми Майкрософт, які включають інтегроване середовище розробки програмного забезпечення та ряд інших інструментальних засобів. Ці продукти дозволяють розробляти як консольні програми, так і програми з графічним інтерфейсом, в тому числі з підтримкою технології Windows Form
Зміст
Вступ 4
1. Постановка задачі 6
2. Огляд літератури 7
2.1. Розпізнавання і детектування. 7
2.2.Чи можна за допомогою OpenCV ідентифікувати людини по обличчю? 7
2.3. OpenCV в ООП. 10
2.3.1. Простір імен в OpenCV 10
2.3.2. Автоматичне управління пам'яттю 10
2.3.3. Автоматичний розподіл вихідних даних. 11
2.3.4. Основні види пікселів. Обмежене використання шаблонів 11
2.3.5. InputArray і OutputArray. 12
2.3.6. Обробка помилок. 12
2.4. Основні модулі OpenCV 13
3. Системний аналіз та об’єктна модель задачі 15
4. Програмне рішення 17
5. Опис проведених експериментів. 18
Висновки 20
Список використаних джерел 21
Додатки 22
Вступ
OpenCV (Open Source Computer Vision Library, бібліотека комп'ютерного зору з відкритим вихідним кодом) - бібліотека алгоритмів комп'ютерного зору, обробки зображень та чисельних алгоритмів загального призначення з відкритим кодом. Реалізована на C / C ++, також розробляється для Python, Java, Ruby, Matlab, Lua та інших мов. Може вільно використовуватися в академічних та комерційних цілях - поширюється в умовах ліцензії BSD.
Використання:
Для затвердження загального стандартного інтерфейсу комп'ютерного зору для додатків у цій галузі. Для сприяння зростанню числа таких додатків і створення нових моделей використання PC.
Зробити платформи Intel привабливими для розробників таких додатків за рахунок додаткового прискорення OpenCV за допомогою Intel® Performance Libraries (Зараз включають IPP (низько-рівневі бібліотеки для обробки сигналів, зображень, а також медіа-кодеки) і MKL (спеціальна версія LAPACK і FFTPack)). OpenCV здатна автоматично виявляти присутність IPP і MKL і використовувати їх для прискорення обробки.
(Зауваження - для роботи OpenCV c IPP версії 5.3 необхідно завантажити з сайту Intel і підмінити файл cxswitcher.cpp - інакше IPP НЕ БУДЕ виявлятися)
Підтримувані платформи та інструменти:
Самі бібліотеки:
Microsoft Windows: компілятори Microsoft Visual C ++ (6.0, .NET 2003), Intel Compiler, Borland C ++, Mingw (GCC 3.x).
Windows RT: портований на ARM компанією Itseez [3]
Linux: GCC (2.9x, 3.x), Intel Compiler: «./configure-make-make install», RPM (spec файл включений в поставку)
Mac OS X: GCC (3.x, 4.x)
Android
iOS
Використовуються C і «полегшений» C ++. Прагма і умовна компіляція використовуються дуже обмежено.
Засоби GUI, захоплення відео:
Microsoft Windows: DirectShow, VfW, MIL, CMU1394
Linux: V4L2, DC1394, FFMPEG
Mac OS X: QuickTime
Документація: статичний HTML, PDF.
Задача розпізнавання образів — це задача віднесення вихідних даних до певного класу за допомогою виділення істотних ознак, що характеризують ці дані, із загальної маси несуттєвих даних.
Розпізнавання образів є однією з найфундаментальніших проблем теорії інтелектуальних систем. З іншого боку, задача розпізнавання образів має величезне практичне значення. Замість терміну "розпізнавання" часто використовується інший термін — "класифікація". Ці два терміни у багатьох випадках розглядаються як синоніми, але не є повністю взаємозамінюваними. Кожний з цих термінів має свої сфери застосування, і інтерпретація обох термінів часто залежить від специфіки конкретної задачі
У процесі біологічної еволюції багато тварин за допомогою зорового й слухового апарата вирішили задачу розпізнавання образів досить добре. Створення штучних систем розпізнавання образів залишається складною теоретичною й технічною проблемою.
Традиційно задачі розпізнавання образів включають у коло задач штучного інтелекту.
1. Постановка задачі
Тема курсового проекту "Розпізнавання образів із використанням бібліотеки OpenCV".
Програма повинна у реальному часі розпізнавати образи через веб-камеру. OpenCV одна з найкращих програм комп'ютерного бачення. Щоб виконати розпізнавання потрібно вибрати спеціальний алгоритм по якому можна виділити окремі складові об'єкту, і навчити програму виконувати розпізнавання. Існує багато алгоритмів за допомогою яких можна знайти той чи інший об'єкт.
У даному проекті будуть використовуватись спеціальні готові скріпти з бібліотеки OpenCV для пошуку обєктів на лиці людини. Також розпізнавання по обєкту з шаблону.
Щоб виконувати розпізнання є можливість виконати захват об'єкту у реальному часу, або виконати збереження потрібно кадру і після його опрацювання. У даному випадку доцільніше буде використати другий варіант, тоді буде можливість якісно зберігати результати розпізнання.
Потрібний зручний інтерфейс, з допомогою якого програма зможе якісно спілкуватись з користувачем і міститиме тільки потрібні функції.
Програма повинна автоматично і без проблем зв'язуватись з веб-камерою, не ускладнюючи роботу користувачу.
2. Огляд літератури
2.1. Розпізнавання і детектування.
В залежності від об'єкту для розпізнавання є свої незалежні риси по яких можна відрізнити один об'єкт від іншого. В геометрії кожна фігура має свій вигляд, по куту, кількості точок можна визначати фігуру.
Щоб визначити колір достатньо порівняти один колір з іншим зробити висновок.
Також виконуються розпізнавання різних об'єктів, типу м'яча, шахової дошки і подібних речей, для цього можна використовувати розпізнавання по контурах, також зміни кольорів з допомогою яких можна визначити приблизний вигляд об'єкту.
Але все ж щоб впізнати об'єкт і назвати його - потрібна, якась попередня база знань, аналогічно і в розробці таких програмних систем розпізнавання.
Вже важчою і найбільш ширшою у плані вибору алгоритмів для розпізнавання є розпізнавання людей. Щоб визначити, що це людина можна звернути на такі основні риси як: руки, ноги, голова. Щоб розпізнати лице можна звернути увагу на ніс, очі, губи. При цьому потрібно щоб ці окремі риси були кожне на своїх місцях, щоб алгоритм
Найскладніше виконати розпізнання людини, визначивши особистість, дуже складно зробити задачу подібного рівня, але все ж можливо. Щоб зробити щось подібне варто звернути увагу на відстань між очима, колір очей, довжину носа, форму голови. Таким чином можна наближено визначити особистість.
2.2.Чи можна за допомогою OpenCV ідентифікувати людини по обличчю? [1]
Після того, як вдалося знаходити обличчя людини і його очі на зображенні, виникає закономірне питання: чи можна ідентифікувати людину? На жаль, вбудованих функцій ідентифікації немає. Але ви можете використовувати наступний підхід.
У різних роботах та ін. запропоновано алгоритми розпізнавання облич людей зокрема на основі виділення характеристичних точок: центрів очей, куточків очей, кінчика носа і т.п. Однак дані методи неможливо використовувати в автоматизованій системі розпізнавання без алгоритму виділення даних точок.
Для знаходження куточків очей, між ними проводиться лінія, щодо якої спостерігається зміна яскравості.
/
Рис.2.1. Залежність яскравості У від номера пікселя n відносно лінії яка починається в центрі лівого ока і закінчується в центрі правого ока
По лівому і правому краях графіка знаходяться мінімуми, відповідні зіницям очей. Різке зростання яскравості означає перехід до білка ока. Подальше зменшення яскравості відповідає куточка ока. При знаходженні кінчика носа необхідно знайти центр між очима, від якого побудувати перпендикуляр в нижню сторону обличчя. Після чого також побудувати залежність яскравості.
/
Рис.2.2. Залежність яскравості У від номера пікселя n відносно лінії для визначення кінчика носа
Як видно з малюнка 2.2, перше значне зниження яскравості означає шуканий кінчик носа, потім вуса та інші частини обличчя. В результаті знайдено три значущі характеристичні точки (рис. 2.3). Аналогічним чином можна знайти і будь-які інші точки.
/
Рис.2.3. Знайдені характерні точки
Запропонований підхід визначення характеристичних точок по зміні яскравості дозволяє в автоматизованому режимі, наприклад при аналізі потоку відеоінформації з Web-камери, здійснювати ідентифікацію осіб. Недоліком даного підходу є те, що функція cvHaarDetectObjects недостатньо точно функціонує на більшості зображеннях. Тому доцільність використання бібліотеки OpenCV для вирішення завдання ідентифікації осіб викликає сумніву. Хоча на початковому етапі, при проведенні досліджень, OpenCV безумовно вам знадобиться.
2.3. OpenCV в ООП. [10]
OpenCV (Open Source Computer Vision Library) є BSD ліцензією бібліотека з відкритим вихідним кодом, яка включає в себе кілька сотень алгоритмів комп'ютерного зору. Документ описує так званий OpenCV 2.x API, який по суті C ++ API, а навпаки C на основі OpenCV 1.x API.
2.3.1. Простір імен в OpenCV
Всі класи і функції OpenCV розміщені в просторі імен CV. Тому, щоб отримати доступ до цієї функції з коду, використовуйте резюме :: специфікатор або за допомогою простору імен CV; директиви:
/
або
/
Деякі з поточних або майбутніх зовнішніх імен OpenCV може конфліктувати з STL або інших бібліотек. У цьому випадку використовуйте явні специфікатори простору імен для вирішення конфліктів імен:
/
2.3.2. Автоматичне управління пам'яттю
OpenCV автоматично обробляє всю пам'ять.
Перш за все, STD :: вектор, Мат, і інші структури даних, використовувані функції і методи мають деструктори, що звільняє основоположні буфери пам'яті, коли це необхідно. Це означає, що деструктори не завжди звільняє буфери, як у випадку Мат. Вони беруть до уваги можливі обміну даними. Деструкція зменшує лічильник посилань, пов'язаний з буфером матрицю даних. Буфер звільняється, якщо і тільки якщо лічильник посилань досягає нуля, тобто, коли ніякі інші структури не відносяться до тих же самим буфером. Точно так само, коли екземпляр Мат копіюється, що не фактичні дані не дуже скопійовані. Замість цього, лічильник посилань збільшується запам'ятати, що є інший власник і тих же даних. Існує також Мат :: метод клон, який створює повну копію даних матриці.
2.3.3. Автоматичний розподіл вихідних даних.
OpenCV звільняє пам'ять, автоматично, а також автоматично виділяє пам'ять для функціональних параметрів вихідного більшу частину часу. Таким чином, якщо функція має один або більше вхідних масивів (примірників резюме :: мат) та деякі вихідні масиви, вихідні масиви автоматично виділяється або перерозподілені. Розмір і тип вихідних масивів визначається розміром і типом вхідних масивів. При необхідності, функції приймають додаткові параметри, які допомагають з'ясувати властивості вихідного масиву.
2.3.4. Основні види пікселів. Обмежене використання шаблонів
Шаблони це цікава особливість C ++, що дозволяє реалізацію дуже потужних, ефективних і в той же безпечних структур даних і алгоритмів. Тим не менш, широке використання шаблонів може значно збільшити час компіляції і розмір коду. Крім того, важко відокремити інтерфейс і реалізацію, коли шаблони можуть бути використані виключно. Це може бути добре для основних алгоритмів, але не дуже добре для комп'ютерного зору бібліотеках, де єдиний алгоритм може займати тисяч рядків коду. Через це, а також для спрощення розробки прив'язок для інших мов, таких як Python, Java, Matlab, які не мають шаблони на всі або мають обмежені можливості шаблону, поточна реалізація OpenCV заснований на поліморфізм і виконання диспетчеризації над шаблонів. У тих місцях, де під час виконання диспетчерського б занадто повільно (як оператори доступу пікселів), неможливо (загальна Ptr <> реалізації), або просто дуже незручне (saturate_cast <> ()) Поточна реалізація представляє маленькі класи шаблонів, методи та функції. У будь-якому іншому місці в поточній версії OpenCV використання шаблонів обмежена.
Отже, існує обмежений фіксований набір примітивних типів даних бібліотека може оперувати. Тобто, елементи масиву повинні мати один з наступних типів:
8-бітове ціле без знака (Uchar)
8-розрядне ціле число (Куля)
16-бітове ціле без знака (USHORT)
16-розрядне ціле число (короткий)
32-розрядне ціле число (ціле)
32-біт з плаваючою комою (з плаваючою точкою)
64-біт з плаваючою комою (подвійний)
Кортеж з декількох елементів, де всі елементи мають однаковий тип (один з вище). Масив, елементи якого є такі кортежі, називаються масиви багатоканальні, а навпаки масивів одно-канальних, елементами яких є скалярні значення. Максимально можлива кількість каналів визначається постійною CV_CN_MAX, який в даний час встановлено у 512.
2.3.5. InputArray і OutputArray.
Багато функцій OpenCV обробки щільних 2-мірних і багатовимірні числові масиви. Як правило, такі функції приймають CPP: клас: Мат в якості параметрів, але в деяких випадках зручніше використовувати зЬй :: вектор <> (для точкового множини, наприклад) або Matx <> (для 3x3 гомографія матриця і таке). Щоб уникнути безлічі дублікатів в API, спеціальні "Проксі" класи були введені. Базовий клас "проксі" є InputArray. Він використовується для передачі тільки для читання масиви на вході функції. Похідним від класу InputArray OutputArray використовується, щоб вказати вихідний масив для функції. Як правило, ви не повинні дбати про тих проміжних типів (і ви не повинні оголошувати змінні цих типів явно) - все це буде просто працювати автоматично. Ви можете вважати, що замість того, щоб InputArray / OutputArray ви завжди можете використовувати килимок, STD :: вектор <>, Matx <>, Vec <> або скаляр. Коли функція має додатковий масив вхідного або вихідного, і ви не маєте або не хочете один, проходять резюме :: noArray ().
2.3.6. Обробка помилок.
OpenCV використовує винятку, щоб сигналізувати про критичні помилки. Коли вхідні дані має правильний формат і належить до зазначеного діапазону значень, але алгоритм не може добитися успіху з деяких причин (наприклад, алгоритм оптимізації не сходяться), він повертає спеціальний код помилки (зазвичай, просто булева змінна) ,
Виняток може бути екземпляри сорти :: клас виключення або його похідних. У свою чергу, резюме :: Exception є похідним ЗПСШ :: винятку. Таким чином, можна витончено оброблятися в коді за допомогою стандартних C ++ бібліотек компонентів.
2.4. Основні модулі OpenCV. [9]
У версії 2.2 бібліотека була реорганізована. Замість універсальних модулів cxcore, cvaux, highGUI та інших було створено кілька компактних модулів з більш вузькою спеціалізацією:
opencv_core - основна функціональність. Включає в себе базові структури, обчислення (математичні функції, генератори випадкових чисел) і лінійну алгебру, DFT, DCT, введення / висновок для XML і YAWL і т. Д.
opencv_imgproc - обробка зображень (фільтрація, геометричні перетворення, перетворення колірних просторів і т. д.).
opencv_highgui - простий UI, введення / виведення зображень і відео.
opencv_ml - моделі машинного навчання (SVM, дерева рішень, навчання зі стимулюванням і т. д.).
opencv_features2d - розпізнавання і опис плоских примітивів (SURF (англ.) рос., FAST та інші, включаючи спеціалізований фреймворк).
opencv_video - аналіз руху і відстеження об'єктів (оптичний потік, шаблони руху, усунення фону).
opencv_objdetect - виявлення об'єктів на зображенні (знаходження осіб за допомогою алгоритму Віоли-Джонса (англ.), розпізнавання людей HOG і т. д.).
opencv_calib3d - калібрування камери, пошук стерео-відповідності та елементи обробки тривимірних даних.
opencv_flann - бібліотека швидкого пошуку найближчих сусідів (FLANN 1.5) і обгортки OpenCV.
opencv_contrib - супутній код, ще не готовий для застосування.
opencv_legacy - застарілий код, збережений заради зворотної сумісності.
opencv_gpu - прискорення деяких функцій OpenCV за рахунок CUDA, створений за підтримки NVidia.
/
Рис.2.4. Архітектура і розробка OpenCV. [9]
/
Рис.2.5. Функціональність OpenCV. [2]
/
Рис.2.6. Загальна схема типового додатку OpenCV. [2]
3. Системний аналіз та об’єктна модель задачі
Для полегшення розробки системи, її потрібно розділити на декілька окремих складових які відповідатимуть за окремі функції. Такий підхід дозволить виконувати написання програми по групах, або зручно писати код і у разі необхідності дописувати окремі складові, також такий підхід дозволить легко ознайомитись з кодом іншому програмісту, якщо буде потреба використати цей код як шаблон, або для підтримки системи виникне потреба внести зміни.
Система міститиме три основні функції: пошук об'єктів в режимі реального часу (Real-time object detection), пошук об'єктів алфавіту(Template detection), також переглядати збережені фото з детектуванням(Watch photo).
Дерево цілей зображено на рис.1.
Модель послідовності роботи системи зображено на рис.2.
/
Рис.3.1.Дерево цілей системи
/
Рис.3.2. Модель послідовностей системи
4. Програмне рішення
[3-8] Під час реалізації системи, було вирішено використати такі методи для пошуку об'єктів, як: пошук об'єкту по шаблону і пошук об'єкту із використанням готових скриптів OpenCV.
В розробці програми застосовано метод RIO для виділення області знайденої частини на зображенні і *.xml файли де містяться скрипти для пошуку рис обличчя.
Програма буде спілкуватись з користувачем на українській мові (меню і всі описи українською мовою), це найбільш доцільно для даного завдання і сфери використання даної системи.
Програму розбито на частини, кожна з яких відповідає за окремі дії, де одна частина програми доповнює іншу. Також це зроблено для зручнішого читання коду, що забезпечує хороше розуміння коду і дозволить покращити проект.
Програма дозволяє виконувати пряму трансляцію через веб-камеру і у разі необхідності знаходження рис лиця, для чого потрібно задати відповідні умови, програма виконає пошук заданих об'єктів ("Розпізнати об'єкт в реальному часі"), також є можливість збереження результату і пізніше перегляду ("Переглянути фото"). Також програма має можливість знаходити потрібну букву,яку задав користувач з англійського алфавіту ("Розпізнати об'єкт по шаблону (алфавіт)").
В програмі застосовуються тільки потрібні бібліотеки, що зменшить навантаження на комп'ютер. В папці системи додано тільки ці *.dll, які потрібні у роботі програми, що допомогло зменшити розмір програми і менш засмічувати папку. Весь код відкритий і прокоментований, що дозволяє досвідченому користувачу внести зміни або ознайомитись з кодовою частиною.
Бібліотеку підключено з допомогою Visual Studio 2013, усі файли і шаблони для роботи програми розміщені в папці системи, що дозволить не засмічувати комп'ютер, також із зручністю знаходити потрібні файли.
5. Опис проведених експериментів.
Висновки
На даній курсовій роботі я із допомогою бібліотеки комп'ютерного бачення OpenCV навчився шукати образи і знаходити об'єкти на фото. Використав такі методи детектування як пошук по шаблону і пошук рис обличчя із допомогою готових скриптів бібліотеки OpenCV.
OpenCV є дуже хороша бібліотеки з великою можливістю функцій, які дозволяють загружати, змінювати і створювати зображення, фактично з допомогою цих функцій можна зробити практично будь-які операції над зображеннями. Також OpenCV дозволяє виконувати аналогічні функції з відео, також знімати власне.
З допомогою OpenCV є можливість виконувати стеження за об'єктами, також виконувати розпізнавання нового об'єкта.
Великий плюс OpenCV у тому, що його функції дозволяють легко підключатись до першої вільної веб-камери, а у разі необхідності можна вибрати іншу ввівши відповідні атрибути, також є можливість вокнувати роботу з кількома камерами, що є також дуже важливим.
Мінус є у тому, що від якості об'єктиву, а саме розширення пікселів залежить якість виконання поставленого завдання. Від малого розширення камери зчитуються низько якісні дані, відповідно бібліотеці складніше опрацювати такі дані, але з цим великих проблем не виникає. Цю проблему можна назвати швидше мінусом апаратної частини. Хоча на мою думку в майбутньому появиться функціонал який буде підвищувати якість отриманих даних, можливо він є і зараз.
Програми подібного характеру можна застосовувати у багатьох галузях.
Для прикладу детектування особистостей може застосовуватись у криміналістиці. Іншим прикладом цього може бути розпізнання рентгенівських знімків для визначення дефекту опорно-рухового апарату. Також слідкувати за ритмом биття серця. Навіть для зчитування штрих-кодів квитків і подібне.
Отже, програми детектування об'єктів є дуже важливою функцією в сучасному житті і бібліотека OpenCV повністю відповідає вимогам для виконання таких програм,функції якої було описано вище.
Список використаних джерел
1. Александр Кручинин. Распознавание образов с использованием OpenCV
2. Вадим Писаревский, ведущий инженер компании ITSEEZ. Начинаем работать с библиотекой OpenCV
3. Baggio D. L., Emami S., Escriva D.M., IevgenK. Mastering OpenCV with practical computer vision projects.
4. Robert Laganiere. OpenCV 2 Computer Vision Application Programming Cookbook.
5. OpenCV крок за кроком: http://robocraft.ru/page/opencv/
6. Бачення за допомогою OpenCV - знаходження лиць на зобрааженні: http://www.digital-sky.ru/point-3/artcateg-17/article-11.html
7. Встановлення OpenCV на Visual Studio 2013:
https://www.youtube.com/watch?v=vwhTKsvHwfQ
8. Створюємо детектор руху: http://habrahabr.ru/company/avi/blog/200804/
9. Початок роботи з бібліотекою OpenCV: http://www.intuit.ru/studies/courses/10621/1105/lecture/17985
10. Опис бібліотеки OpenCV: http://docs.opencv.org/modules/core/doc/intro.html
Додатки
ДОДАТОК
Програмний код:
//#pragma warning(disable: 4996) Забрати помилку
//#define _CRT_SECURE_NO_WARNINGS
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#include <fstream>
using namespace std;
\