Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 3. Безмаркерна доповнена реальність
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Щоб зробити алгоритм ще більш ефективним, можемо відфільтрувати зайві точки шляхом використання методу консенсусу випадкової вибірки RANSAC. Оскільки ми працюємо із зображенням (плоским об'єктом) та вважаємо, що воно суцільне, можна шукати перетворення гомографії між особливими точками шаблону, з одного боку, та зображення запиту з іншого. Їх метою є перенесення точок шаблону в координатну систему останнього. Для цього скористаємось функцією cv::findHomography, що застосовує RANSAC для пошуку найкращої матриці гомографії методом випробування підмножин вхідних точок. Як побічний ефект, функціія відмічає кожну відповідність як ключову чи зайву точку, залежно від похибки репроєкції для обчисленої матриці. Atronax 20.02.21 в 11:43 |
|
|
PatternDetector.cpp Atronax 20.02.21 в 11:45 |
||
|
/ Знайдемо матрицю гомографії та маску внутрішніх точок Atronax 20.02.21 в 11:46 |
||
|
Це візуалізація співпадінь, оброблених з використанням даної техніки: Atronax 20.02.21 в 11:48 |
||
|
Уточнюємо гомографію Atronax 20.02.21 в 11:49 |
||
|
Коли ми знаходимо перетворення гомографії, вже наявні всі дані, необхідні для пошуку положення точок у тривимірному просторі. Однак, можна значно покращити результат, знайшовши більш точні кути шаблона. Для цього деформуємо вхідний кадр з використанням обрахованої гомографії, щоб отримати знайдений шаблон. Результат має бути досить близьким до вихідного тренувального зображення. Уточнення гомографії допоможе знайти ефективніші перетворення. Atronax 20.02.21 в 12:01 |
||
|
Далі отримаємо інші гомографію та набір внутрішніх точок. Кращим результатом буде матриця, що дорівнює добутку першої (H1) та другої (H2). Atronax 20.02.21 в 12:04 |
||
|
PatternDetector.cpp Atronax 20.02.21 в 12:15 |
||
|
cv::warpPerspective(m_grayImg, m_warpedImg, Atronax 20.02.21 в 12:16 |
||
|
// Отримуємо результат як добуток матриць Atronax 20.02.21 в 12:18 |
||
|
Якщо після етапів видалення зайвих точок кількість співпадінь все ще досить велика (як мінімум 25 відсотків особливих точок шаблона мають відповідності із вхідним зображенням), можна бути певними, що шаблон розміщений правильно. Якщо це так, переходимо на наступний етап - оцінку 3D пози шаблона відносно камери. Atronax 20.02.21 в 12:20 |
||
|
З'єднуємо все докупи Atronax 20.02.21 в 12:20 |
||
|
Для зберігання екземплярів детектора особливих точок, видобувача дескрипторів та алгоритмів пошуку співпадінь використаємо клас PatternMatcher, що інкапсулюватиме ці дані. Він керуватиме алгоритмами пошуку особливих точок та дескрипторів, логікою порівняння та налаштуваннями, що контролюють процес розпізнавання. Atronax 20.02.21 в 12:24 |
||
|
Клас пропонує методи обчислення всіх необхідних даних для формування шаблону із вказаного зображення: Atronax 20.02.21 в 12:26 |
||
|
Цей метод шукає особливі точки на вхідному зображенні та видобуває дескриптори, використовуючи налаштовані алгоритми детектора та екстрактора, та формує шаблон для більш пізнього використання. Коли його знайдено, можемо натренувати детектор викликом методу: Atronax 20.02.21 в 12:30 |
||
|
Аргументом функції є поточний цільовий шаблон, який має бути знайденим. До того ж, вона тренує механізм пошуку співпадінь набором дескрипторів. Викликавши метод, ми вже готові знайти тренувальне зображення. Розпізнавання шаблона здійснюється в останній відкритій функції findPattern. Цей метод інкапсулює процедуру як описано раніше, включно з розпізнаванням, видобуванням дескрипторів та пошуком співпадінь з фільтрацією зайвих точок. Atronax 20.02.21 в 12:38 |
||
|
Підіб'ємо підсумки коротким списком виконаних кроків: Atronax 20.02.21 в 12:43 |
||
|
Оцінюємо позу шаблона Atronax 21.02.21 в 08:19 |
||
|
Цей процес виконується подібно до оцінки пози маркера з попереднього розділу. Як звичайно, для визначення зовнішніх параметрів камери нам знадобляться 2D-3D відповідності. Чотири тривимірні точки мають відповідати кутам одиничного прямокутника, що лежить в площині XY (вісь Z напрямлена вверх), а двовимірні - кутам растрового зображення. Atronax 21.02.21 в 08:28 |
||
|
PatternDetector.cpp Atronax 21.02.21 в 08:31 |
||
|
// Розміри зображення Atronax 21.02.21 в 08:32 |
||
|
Дана конфігурація кутів вигідна, адже початок системи координат знаходитиметься прямо в його центрі місцеположення шаблона, що лежить в площині XY, а вісь Z при цьому напрямлена в бік камери. Atronax 21.02.21 в 08:39 |
||
|
Отримуємо матрицю внутрішніх характеристик камери Atronax 21.02.21 в 08:40 |
||
|
Внутрішні параметри камери можна вирахувати за допомогою програми camera_cailbration.exe, що включена до дистрибутивного пакету бібліотеки OpenCV. За рахунок обробки шаблонних зображень вона визначить властивості лінзи, серед яких фокусна відстань, кардинальна точка та коефіцієнти викривлення. Скажімо, маємо набір з восьми зображень для калібрування, що зняті з різних точок зору: Atronax 21.02.21 в 08:49 |
||
|
У такому разі команда для здійснення калібрування виглядатиме таким чином: Atronax 21.02.21 в 08:50 |
||
|
Перша команда створить список зображень PNG поточної теки у форматі YAML, який інструмент для калібрування очікує отримати як вхідні дані. Можна також вказати точні назви файлів, наприклад img1.png, img2.png чи img3.png. Згенерований файл imagelist.yaml потім передається застосунку для калібрування. Крім цього, інструмент може отримувати зображення зі звичайної вебкамери. Atronax 21.02.21 в 08:55 |
||
|
Ми визначаємо розміри шаблона калібрування, а також вхідні та вихідні файли для отриманих даних. Atronax 21.02.21 в 08:56 |
||
|
Після завершення калібрування файл формату YAML матиме наступний вигляд: Atronax 21.02.21 в 08:57 |
||
|
У першу чергу нас цікавить camera_matrix, що описує матрицю 3х3 внутрішніх характеристик. Вона має наступний вигляд: Atronax 21.02.21 в 08:58 |
||
|
Нас цікавлять чотири компоненти: fx, fy, cx та cy. Використавши ці дані, можемо створити екземпляр об'єкта для калібрування камери таким чином: Atronax 21.02.21 в 09:01 |
||
|
Без коректного калібрування камери неможливо створити доповнену реальність з природнім виглядом. Знайдені перетворення перспективи відрізнятимуться від трансформацій камери. Це змусить доповнені об'єкти виглядати так, немовби вони знаходяться надто близько чи, навпаки, далеко. Далі знаходиться приклад скріншоту зі штучно зміненими параметрами калібрування: Atronax 21.02.21 в 09:07 |
||
|
Вочевидь, перспективний погляд на куб відрізняється від решти сцени. Atronax 21.02.21 в 09:21 |
||
|
Примітка Atronax 21.02.21 в 09:27 |
||
|
Розглянемо тривимірні точки тренувального об'єкта шаблона та відповідні проєкції у двовимірному просторі зі структури PatternTrackingInfo; калібрування камери зберігається в приватних полях класу PatternDetector. Atronax 21.02.21 в 09:29 |
||
|
Pattern.cpp Atronax 21.02.21 в 09:31 |
||
|
// Копіюємо до матриці перетворень Atronax 21.02.21 в 09:43 |
||
|
Інфраструктура застосунку Atronax 21.02.21 в 09:43 |
||
|
Дотепер ми познайомились з процесом розпізнавання шаблона та оцінки його позиції відносно камери. Настав час поєднати ці алгоритми в готовий застосунок. Ця частина призначена пояснити процес використання OpenCV для захоплення відео з вебкамери та створення контексту для 3D візуалізації. Atronax 21.02.21 в 09:49 |
||
|
Оскільки ми бажаємо пояснити, як використати ключові особливості безмаркерної AR, створимо простий застосунок для командної стрічки, що зможе розпізнавати будь-які шаблони на послідовності відеокадрів чи звичайних зображеннях. Atronax 21.02.21 в 09:51 |
||
|
Для зберігання логіки обробки зображення та посередніх даних використаємо клас ARPipeline. Це базовий об'єкт, що включає всі компоненти, необхідні для створення доповненої реальності, та здійснює всі процедури обробки вхідних кадрів. Далі знаходиться UML-діаграма класу ARPipeline та його елементи: Atronax 21.02.21 в 09:58 |
||
|
ARPipeline.hpp Atronax 21.02.21 в 10:00 |
||
|
У конструкторі ARPipeline налаштовується об'єкт шаблона, а також у приватних полях зберігаються дані калібрування. Функція processFrame реалізує алгоритм розпізнавання та процедуру оцінки пози. Повернене значення при цьому вказує на успіх процесу. Знайдену позу шаблона можна отримати, викликавши функцію getPatternLocation. Atronax 21.02.21 в 10:20 |
||
|
ARPipeline.cpp Atronax 21.02.21 в 10:21 |
||
|
Під'єднуємо підтримку 3D візуалізації в OpenCV Atronax 21.02.21 в 10:22 |
||
|
Як і в попередньому розділі, для роботи з 3D застосуємо OpenGL. Але на відміну від середовища iOS, для якого ми мали дотримуватись певних вимог до архітектури, у цьому разі отримаємо більше свободи. На платформах Windows чи Mac можна обирати серед доступних двигунів. Далі в розділі навчимось створювати кросплатформову 3D візуалізацію з використанням OpenCV. Починаючи з версії 2.4.2, бібліотека підтримує спільну роботу з OpenGL. Це значить, що можна легко візуалізувати будь-який 3D контент в OpenCV. Atronax 21.02.21 в 10:47 |
||
|
Щоб налаштувати вікно OpenGL, спершу потрібно побудувати OpenCV з підтримкою цієї бібліотеки. Інакше у разі використання необхідних функцій формуються вийнятки. Щоб здобути підтримку бібліотеки, будувати необхідно з активованим флагом ENABLE_OPENGL=YES. Atronax 21.02.21 в 10:58 |
||
|
Примітка Atronax 21.02.21 в 11:04 |
||
|
Щоб мати можливість використовувати вікно OpenGL в OpenCV, здійснимо наступні кроки: Atronax 21.02.21 в 11:05 |
||
|
Обираємо необхідні параметри OpenCV та формуємо робочий простір для IDE. Для виконання цього кроку потрібен застосунок CMake, який можна завантажити з ресурсу: http://www.cmake.org/cmake/resources/software.html. Atronax 22.02.21 в 08:29 |
||
|
Щоб налаштувати OpenCV, можна або виконати команду CMake таким чином (у теці, де має бути розміщеним згенерований проєкт): Atronax 22.02.21 в 08:37 |
