Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 3. Безмаркерна доповнена реальність
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
У цьому розділі читачі дізнаються, як створювати стандартні проєкти OpenCV, що діють в режимі реального часу, а також як застосувати метод безмаркерної доповненої реальності, при якому дійсне середовище використовується як вхідні дані замість надрукованих квадратних маркерів. Подальший текст опише дещо з теорії безмаркерної AR та покаже як пристосувати її в корисних програмах. Atronax 19.02.21 в 08:18 |
|
|
Далі подано список тем, описаних у даному розділі: Atronax 19.02.21 в 08:21 |
||
|
Перш ніж почнемо, подамо короткий список необхідних знань та програмного забезпечення: Atronax 19.02.21 в 08:26 |
||
|
Базові знання CMake. Це кросплатформова відкрита система, розроблена для побудови, тестування та формування програмних пакетів. Подібно до бібліотеки OpenCV, демонстраційний проєкт для цього розділу також використовує CMake. Його можна завантажити з ресурсу http://www.cmake.org/. Atronax 19.02.21 в 08:29 |
||
|
Знання основ програмування з використанням мови C++ також необхідне. Однак, всі складні частини коду застосунку пояснимо детальніше. Atronax 19.02.21 в 08:31 |
||
|
Заснована на маркерах доповнена реальність проти безмаркерної Atronax 19.02.21 в 08:31 |
||
|
З попереднього розділу ви дізналися, як використовувати особливі зображення, що називаються маркерами, щоб доповнювати реальні сцени. Переваги маркерів такі: Atronax 19.02.21 в 08:32 |
||
|
Маркери мають і недоліки. Вони такі: Atronax 19.02.21 в 08:34 |
||
|
Таким чином, маркери - це непоганий старт для роботи з доповненою реальністю; але якщо потрібні більші можливості, час переходити з маркерної до безмаркерної AR. Це техніка розпізнавання об'єктів, що існують в реальному світі. Декілька прикладів цілей для цього виду: обкладинки журналів, логотипи компаній, іграшки тощо. Взагалі кажучи, будь-який об'єкт, що має достатньо описових характеристик та відрізняється від решти сцени може бути ціллю для доповненої реальності без використання маркерів. Atronax 19.02.21 в 08:52 |
||
|
Переваги безмаркерного підходу такі: Atronax 19.02.21 в 08:53 |
||
|
Безмаркерні системи AR здатні використовувати зображення та об'єкти, щоб розміщувати камеру в тривимірному просторі та формувати вражаючі ефекти на поверхні кадру. Їхнім ядром є алгоритми розпізнавання зображення та пошуку об'єктів. У противагу маркерам, чиї форма та внутрішня структура відома, реальні об'єкти не можна визначити таким чином. До того ж, об'єкти можуть мати складну форму, тому потребують модифікованих алгоритмів оцінки пози для пошуку коректних 3D перетворень. Atronax 19.02.21 в 09:07 |
||
|
Примітка Atronax 19.02.21 в 09:11 |
||
|
Безмаркерна доповнена реальність потребує складних обчислень на процесорі, тому мобільний пристрій часто не здатний підтримувати прийнятний рівень FPS. У нашому випадку цільовими машинами є стаціонарні, як-от ПК чи Mac. Саме тому потрібна кросплатформова система побудови. У розділі використано CMake. Atronax 19.02.21 в 09:24 |
||
|
Використовуємо дескриптори особливих точок для пошуку конкретних зображень на відео Atronax 19.02.21 в 09:24 |
||
|
Розпізнавання зображення - це техніка комп'ютерного зору, що дозволяє знайти вхідний результат для певного растрового шаблону. Наш алгоритм повинен розпізнавати, навіть якщо змінені його масштаб, поворот чи він має відмінну від оригінального зображення яскравість. Atronax 19.02.21 в 09:28 |
||
|
Як порівняти шаблонне зображення з іншими? Оскільки на нього можуть впливати перспективні перетворення, очевидно, не можна напряму порівнювати пікселі шаблону та тестового зображення. У подібних випадках зарадять особливі точки та дескриптори. Не існує універсального, точного визначення, чим саме є особлива точка. Воно часто відрізняється залежно від цілі та типу застосунку. Звичайно, особливою точкою позначають "цікаву" частину зображення, а їх набір використовують як початкові дані для багатьох алгоритмів комп'ютерного зору. У цьому розділі скористаємось терміном "особлива точка", згідно з яким вона є частиною зображення з певним центром, радіусом та орієнтацією. Кожен алгоритм розпізнавання намається знайти ті ж особливі точки незалежно від застосованих перспективних перетворень. Atronax 19.02.21 в 09:36 |
||
|
Виокремлюємо особливі точки Atronax 19.02.21 в 09:36 |
||
|
Розпізнавання особливих точок - це метод виявлення зон інтересу на вхідному зображенні. Існує чимало алгоритмів, які призначені для пошуку меж, кутів чи скупчень. У даному випадку ми зацікавлені в розпізнаванні кутів, виокремлення яких потребує аналізу меж зображення. Такий алгоритм шукає швидкі зміни на градієнті зображення, а для цього, у більшості випадків, потрібно обчислити екстремуми першої похідної градієнтів у напрямках осей X та Y. Atronax 19.02.21 в 09:59 |
||
|
Орієнтацію особливої точки звичайно визначають як напрям домінатного градієнта зображення у певній зоні. Якщо його повертають або змінюють масштаб, ця характеристика повторно обчислюється алгоритмом розпізнавання особливих точок. Таким чином, їх орієнтація залишиться тією ж, не зважаючи на поворот зображення. Такі точки називають інваріантними відносно повороту. Atronax 19.02.21 в 10:06 |
||
|
Також варто врахувати такі важливі факти. Деякі алгоритми працюють з особливими точками фіксованого розміру, у той час як інші обчислюють оптимальний для кожної окремо. Знаючи розмір, ми зможемо знаходити ті ж точки на збільшених чи зменшених кадрах, що робить їх інваріантними відносно зміни масштабу вхідного зображення. Atronax 19.02.21 в 10:13 |
||
|
OpenCV має декілька алгоритмів розпізнавання особливих точок. Усі вони походять від базового класу cv::FeatureDetector. Створити об'єкт для розпізнавання можна двома шляхами: Atronax 19.02.21 в 10:17 |
||
|
Обидва методи мають свої переваги, тому оберіть той, що підходить саме вам. Явне створення екземпляра класу дозволяє передати додаткові аргументи конструктуру детектора особливих точок, а створення з використанням назви полегшує зміну алгоритму в процесі роботи програми. Atronax 19.02.21 в 10:19 |
||
|
Щоб розпізнати особливі точки, маємо викликати наступний метод: Atronax 19.02.21 в 10:20 |
||
|
Знайдені особливі точки поміщуються у контейнері keypoints. Кожна з них описана центром, радіусом, кутом, Atronax 19.02.21 в 10:23 |
||
|
Кожен алгоритм розпізнавання має власний спосіб обчислення рейтингу, тому цю характеристику особливих точок можна порівняти між собою. Atronax 19.02.21 в 10:31 |
||
|
Примітка Atronax 19.02.21 в 10:48 |
||
|
Кращих результатів у розпізнаванні шаблонів можна досягнути, якщо детектор вирахує орієнтацію та розмір ключових точок. Це зробить їх інваріантними відносно повороту та змін масштабу. Найвідоміші й найточніші методи розпізнавання особливих точок добре відомі, вони використовуються в алгоритмах SIFT та SURF. Atronax 19.02.21 в 10:52 |
||
|
На жаль, вони запатентовані, тобто не безкоштовні для комерційного використання. Однак, в OpenCV доступна реалізація, тому можна вільно використати їх для особистих проєктів. Але існують непогані безкоштовні замінники. Можна застосувати алгоритми ORB чи FREAK. Детектор ORB - це модифікований FAST, оригінальна версія якого надзвичайно швидка, але не обчислює орієнтацію чи розміри ключової точки. На щастя, алгоритм ORB оцінює орієнтацію, але розмір все ще залишається фіксованим. З наступних параграфів ви дізнаєтесь непогані дешеві способи виправити це. Але спершу дозвольте пояснити, чому особливі точки такі важливі для розпізнавання зображень. Atronax 19.02.21 в 11:04 |
||
|
Маючи справу із зображеннями, глибина кольору яких складає 24 біти на піксель, для роздільної здатності 640x480 отримаємо 912 кб даних. Як знайти зображення шаблону в реальному світі? Попіксельний пошук співпадінь займає надто багато часу, а ще ж маємо врахувати поворот та скалювання. Це явно не вихід. Проблему вирішують особливі точки. Розпізнавши їх, можемо бути певні, що вони описують частини зображення з корисними даними (так відбувається тому, що засновані на кутах детектори повертають межі, кути та інші гострі фігури). Тому, щоб знайти відповідності між двома кадрами, залишилось лише перевірити ключові точки на співпадіння. Atronax 19.02.21 в 13:17 |
||
|
З визначеного фрагмента зображення видобуваємо вектор під назвою дескриптор. Це форма представлення особливої точки. Отримати його можна різними способами, кожен з яких має свої переваги та недоліки. Наприклад, алгоритми SIFT та SURF займають багато процесорного часу, але забезпечують точними дескрипторами з непоганою виразністю. У нашому проєкті застосовано алгоритм пошуку дескрипторів ORB, адже ми можемо використати його також як детектор особливих точок. Atronax 19.02.21 в 13:25 |
||
|
Примітка Atronax 19.02.21 в 13:28 |
||
|
Дескриптор особливої точки представлений вектором фіксованого розміру (16 чи більше елементів). Нехай наше зображення має роздільну здатність 640x480 пікселів та 1500 ключових точок. Тоді для виконання алгоритму SURF знадобиться 1500*16*sizeof(float) = 96 кб даних. Це вдесятеро менше, аніж розмір початкових даних. Також, з дескрипторами набагато легше працювати, аніж з растровими зображеннями. Для двох дескрипторів особливих точок представимо рейтинг схожості - метрику, яка визначатиме подібність двох векторів. Зазвичай, це норма L2 чи відстань Хеммінга (залежить від виду використаного дескриптора). Atronax 19.02.21 в 13:33 |
||
|
Алгоритми пошуку дескрипторів особливих точок походять від базового класу cv::DescriptorExtractor. Подібним чином до методів розпізнавання, вони можуть бути створені з визначенням назви або явним викликом конструктора. Atronax 19.02.21 в 13:35 |
||
|
Визначаємо об'єкт шаблона Atronax 19.02.21 в 13:35 |
||
|
Для опису об'єкта шаблона використаємо клас Pattern, який вміщуватиме тренувальне зображення, список особливих точок та здобутих дескрипторів, а також 2D-3D відповідності для початкової позиції шаблона: Atronax 19.02.21 в 13:39 |
||
|
Перевіряємо особливі точки на співпадіння Atronax 19.02.21 в 13:39 |
||
|
Процес знаходження покадрових відповідностей можна сформулювати як пошук найближчого сусіда серед одного набору дескрипторів для кожного елемента з іншого набору. Це так звана процедура "пошуку співпадінь". У бібліотеці OpenCV існує два головні алгоритми: Atronax 20.02.21 в 08:41 |
||
|
Перший спосіб шукає кожен дескриптор у першому наборі та найближчий до нього в другому, перевіряючи кожну пару по черзі (вичерпний пошук), у той час як cv::FlannBasedMatcher для пошуку відповідностей застосовує алгоритм швидкої апроксимації найближчого сусіда (для цього використовується окрема бібліотека). Atronax 20.02.21 в 08:53 |
||
|
Результатом процесу є список відповідностей між двома наборами дескрипторів. Перший частіше за все називають тренувальним, адже від відповідає зображенню шаблона. Другий відомий під назвою набору запиту, оскільки він належить зображенню, на якому здійснюється пошук об'єкта. Чим більше коректних співпадінь знайдемо (існує більше відповідностей між шаблоном та зображенням), тим більше шансів, що потрібний об'єкт присутній на кадрі. Atronax 20.02.21 в 08:59 |
||
|
Щоб прискорити процедуру, можна заздалегідь натренувати пошук співпадінь за допомогою функції match. Даний етап можна використати для оптимізації продуктивності cv::FlannBasedMatcher. З цією метою тренувальний клас сформує дерева індексів для дескрипторів. Це сприятиме більш швидкому пошуку співпадінь для великих наборів даних (наприклад, якщо потрібно порівняти сотні зображень). Для cv::BFMatcher відповідний клас не робить нічого, адже даних для обробки не існує; він всього лише зберігає тренувальні дескриптори у внутрішніх полях. Atronax 20.02.21 в 09:24 |
||
|
PatternDetector.cpp Atronax 20.02.21 в 09:31 |
||
|
Щоб знайти співпадіння серед дескрипторів запиту, застосуємо один з наступних методів cv::DescriptorMatcher: Atronax 20.02.21 в 09:36 |
||
|
Видаляємо зайві точки Atronax 20.02.21 в 09:37 |
||
|
Під час етапу порівняння можуть траплятися невірні співпадіння. Це нормально. Існує два типи помилок: Atronax 20.02.21 в 09:43 |
||
|
Хибна відсутність співпадінь - це, звичайно, суттєвий недолік. Але рішення проблеми немає, адже алгоритм їх не врахував. Нашою метою є лише мінімізація кількості хибних появ. Щоб видалити невірні відповідності, можна скористатися технікою перехресної перевірки. Ідея полягає в порівнянні тренувальних дескрипторів з набором запиту та навпаки. У цьому разі результатом будуть виключно спільні співпадіння. Така техніка зазвичай формує кращі результати з мінімальною кількістю зайвих точок у випадку достатньої кількості співпадінь. Atronax 20.02.21 в 10:24 |
||
|
Фільтруємо перехресні співпадіння Atronax 20.02.21 в 10:27 |
||
|
Ця процедура доступна в класі cv::BFMatcher. Щоб під'єднати перехресну перевірку, створимо об'єкт cv::BFMatcher з другим аргументом true: Atronax 20.02.21 в 10:42 |
||
|
PatternDetector.cpp Atronax 20.02.21 в 11:15 |
||
|
Тест відношень здатний видалити практично всі зайві точки. Але в деяких випадках хибні появи можуть проходити його. У наступній частині розділу покажемо, як видалити їх та залишити лише коректні співпадіння. Atronax 20.02.21 в 11:16 |
||
|
Оцінюємо гомографію Atronax 20.02.21 в 11:17 |
