Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 3. Безмаркерна доповнена реальність

← →
Английский оригинал Перевод на украинский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

У цьому розділі читачі дізнаються, як створювати стандартні проєкти OpenCV, що діють в режимі реального часу, а також як застосувати метод безмаркерної доповненої реальності, при якому дійсне середовище використовується як вхідні дані замість надрукованих квадратних маркерів. Подальший текст опише дещо з теорії безмаркерної AR та покаже як пристосувати її в корисних програмах.

Atronax 19.02.21 в 08:18

0

Далі подано список тем, описаних у даному розділі:
Заснована на маркерах доповнена реальність проти безмаркерної
Використання дескрипторів особливих точок для пошуку конкретних зображень на відео
Оцінка пози шаблона
Інфраструктура застосунку
Підтримка візуалізації OpenGL в OpenCV
Візуалізація доповненої реальності
Демонстрація

Atronax 19.02.21 в 08:21

0

Перш ніж почнемо, подамо короткий список необхідних знань та програмного забезпечення:

Atronax 19.02.21 в 08:26

0

Базові знання CMake. Це кросплатформова відкрита система, розроблена для побудови, тестування та формування програмних пакетів. Подібно до бібліотеки OpenCV, демонстраційний проєкт для цього розділу також використовує CMake. Його можна завантажити з ресурсу http://www.cmake.org/.

Atronax 19.02.21 в 08:29

0

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

Atronax 19.02.21 в 08:31

0

Заснована на маркерах доповнена реальність проти безмаркерної

Atronax 19.02.21 в 08:31

0

З попереднього розділу ви дізналися, як використовувати особливі зображення, що називаються маркерами, щоб доповнювати реальні сцени. Переваги маркерів такі:
Дешевий алгоритм розпізнавання
Стійкість до змін умов освітлення

Atronax 19.02.21 в 08:32

0

Маркери мають і недоліки. Вони такі:
Не працюють, якщо частково перекриті іншими об'єктами
Зображення маркера має бути чорно-білим
Має квадратну форму у більшості випадків (адже її легше розпізнати)
Неестетичний візуальний вигляд маркера
Не має нічого спільного з реальними об'єктами

Atronax 19.02.21 в 08:34

0

Таким чином, маркери - це непоганий старт для роботи з доповненою реальністю; але якщо потрібні більші можливості, час переходити з маркерної до безмаркерної AR. Це техніка розпізнавання об'єктів, що існують в реальному світі. Декілька прикладів цілей для цього виду: обкладинки журналів, логотипи компаній, іграшки тощо. Взагалі кажучи, будь-який об'єкт, що має достатньо описових характеристик та відрізняється від решти сцени може бути ціллю для доповненої реальності без використання маркерів.

Atronax 19.02.21 в 08:52

0

Переваги безмаркерного підходу такі:
Можна використати для розпізнавання реальних об'єктів
Працює навіть якщо цільовий об'єкт частково перекритий
Може мати різноманітну форму та текстуру (крім повністю заповнених чи градієнтних)

Atronax 19.02.21 в 08:53

0

Безмаркерні системи AR здатні використовувати зображення та об'єкти, щоб розміщувати камеру в тривимірному просторі та формувати вражаючі ефекти на поверхні кадру. Їхнім ядром є алгоритми розпізнавання зображення та пошуку об'єктів. У противагу маркерам, чиї форма та внутрішня структура відома, реальні об'єкти не можна визначити таким чином. До того ж, об'єкти можуть мати складну форму, тому потребують модифікованих алгоритмів оцінки пози для пошуку коректних 3D перетворень.

Atronax 19.02.21 в 09:07

0

Примітка
Щоб зрозуміти ідею безмаркерної доповненої реальності, в якості цілі використаємо плоске зображення. Об'єкти зі складними формами не будуть враховатися. Їх використання обговоримо пізніше у даному розділі.

Atronax 19.02.21 в 09:11

0

Безмаркерна доповнена реальність потребує складних обчислень на процесорі, тому мобільний пристрій часто не здатний підтримувати прийнятний рівень FPS. У нашому випадку цільовими машинами є стаціонарні, як-от ПК чи Mac. Саме тому потрібна кросплатформова система побудови. У розділі використано CMake.

Atronax 19.02.21 в 09:24

0

Використовуємо дескриптори особливих точок для пошуку конкретних зображень на відео

Atronax 19.02.21 в 09:24

0

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

Atronax 19.02.21 в 09:28

0

Як порівняти шаблонне зображення з іншими? Оскільки на нього можуть впливати перспективні перетворення, очевидно, не можна напряму порівнювати пікселі шаблону та тестового зображення. У подібних випадках зарадять особливі точки та дескриптори. Не існує універсального, точного визначення, чим саме є особлива точка. Воно часто відрізняється залежно від цілі та типу застосунку. Звичайно, особливою точкою позначають "цікаву" частину зображення, а їх набір використовують як початкові дані для багатьох алгоритмів комп'ютерного зору. У цьому розділі скористаємось терміном "особлива точка", згідно з яким вона є частиною зображення з певним центром, радіусом та орієнтацією. Кожен алгоритм розпізнавання намається знайти ті ж особливі точки незалежно від застосованих перспективних перетворень.

Atronax 19.02.21 в 09:36

0

Виокремлюємо особливі точки

Atronax 19.02.21 в 09:36

0

Розпізнавання особливих точок - це метод виявлення зон інтересу на вхідному зображенні. Існує чимало алгоритмів, які призначені для пошуку меж, кутів чи скупчень. У даному випадку ми зацікавлені в розпізнаванні кутів, виокремлення яких потребує аналізу меж зображення. Такий алгоритм шукає швидкі зміни на градієнті зображення, а для цього, у більшості випадків, потрібно обчислити екстремуми першої похідної градієнтів у напрямках осей X та Y.

Atronax 19.02.21 в 09:59

0

Орієнтацію особливої точки звичайно визначають як напрям домінатного градієнта зображення у певній зоні. Якщо його повертають або змінюють масштаб, ця характеристика повторно обчислюється алгоритмом розпізнавання особливих точок. Таким чином, їх орієнтація залишиться тією ж, не зважаючи на поворот зображення. Такі точки називають інваріантними відносно повороту.

Atronax 19.02.21 в 10:06

0

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

Atronax 19.02.21 в 10:13

0

OpenCV має декілька алгоритмів розпізнавання особливих точок. Усі вони походять від базового класу cv::FeatureDetector. Створити об'єкт для розпізнавання можна двома шляхами:
Явно викликати конструктор певного виду детектора:
cv::Ptr<cv::FeatureDetector> detector =
cv::Ptr<cv::FeatureDetector>(new cv::SurfFeatureDetector());
Чи створити детектор, вказавши назву алгоритму:
cv::Ptr<cv::FeatureDetector> detector =
cv::FeatureDetector::create("SURF");

Atronax 19.02.21 в 10:17

0

Обидва методи мають свої переваги, тому оберіть той, що підходить саме вам. Явне створення екземпляра класу дозволяє передати додаткові аргументи конструктуру детектора особливих точок, а створення з використанням назви полегшує зміну алгоритму в процесі роботи програми.

Atronax 19.02.21 в 10:19

0

Щоб розпізнати особливі точки, маємо викликати наступний метод:
std::vector<cv::KeyPoint> keypoints;
detector->detect(image, keypoints);

Atronax 19.02.21 в 10:20

0

Знайдені особливі точки поміщуються у контейнері keypoints. Кожна з них описана центром, радіусом, кутом,
рейтингом та корелює з "якістю" та "силою" особливої точки.

Atronax 19.02.21 в 10:23

0

Кожен алгоритм розпізнавання має власний спосіб обчислення рейтингу, тому цю характеристику особливих точок можна порівняти між собою.

Atronax 19.02.21 в 10:31

0

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

Atronax 19.02.21 в 10:48

0

Кращих результатів у розпізнаванні шаблонів можна досягнути, якщо детектор вирахує орієнтацію та розмір ключових точок. Це зробить їх інваріантними відносно повороту та змін масштабу. Найвідоміші й найточніші методи розпізнавання особливих точок добре відомі, вони використовуються в алгоритмах SIFT та SURF.

Atronax 19.02.21 в 10:52

0

На жаль, вони запатентовані, тобто не безкоштовні для комерційного використання. Однак, в OpenCV доступна реалізація, тому можна вільно використати їх для особистих проєктів. Але існують непогані безкоштовні замінники. Можна застосувати алгоритми ORB чи FREAK. Детектор ORB - це модифікований FAST, оригінальна версія якого надзвичайно швидка, але не обчислює орієнтацію чи розміри ключової точки. На щастя, алгоритм ORB оцінює орієнтацію, але розмір все ще залишається фіксованим. З наступних параграфів ви дізнаєтесь непогані дешеві способи виправити це. Але спершу дозвольте пояснити, чому особливі точки такі важливі для розпізнавання зображень.

Atronax 19.02.21 в 11:04

0

Маючи справу із зображеннями, глибина кольору яких складає 24 біти на піксель, для роздільної здатності 640x480 отримаємо 912 кб даних. Як знайти зображення шаблону в реальному світі? Попіксельний пошук співпадінь займає надто багато часу, а ще ж маємо врахувати поворот та скалювання. Це явно не вихід. Проблему вирішують особливі точки. Розпізнавши їх, можемо бути певні, що вони описують частини зображення з корисними даними (так відбувається тому, що засновані на кутах детектори повертають межі, кути та інші гострі фігури). Тому, щоб знайти відповідності між двома кадрами, залишилось лише перевірити ключові точки на співпадіння.

Atronax 19.02.21 в 13:17

0

З визначеного фрагмента зображення видобуваємо вектор під назвою дескриптор. Це форма представлення особливої точки. Отримати його можна різними способами, кожен з яких має свої переваги та недоліки. Наприклад, алгоритми SIFT та SURF займають багато процесорного часу, але забезпечують точними дескрипторами з непоганою виразністю. У нашому проєкті застосовано алгоритм пошуку дескрипторів ORB, адже ми можемо використати його також як детектор особливих точок.

Atronax 19.02.21 в 13:25

0

Примітка
Завжди корисно застосовувати детектор особливих точок і видобувач дескрипторів з того ж алгоритму, оскільки вони спроєктовані для ідеальної спільної роботи.

Atronax 19.02.21 в 13:28

0

Дескриптор особливої точки представлений вектором фіксованого розміру (16 чи більше елементів). Нехай наше зображення має роздільну здатність 640x480 пікселів та 1500 ключових точок. Тоді для виконання алгоритму SURF знадобиться 1500*16*sizeof(float) = 96 кб даних. Це вдесятеро менше, аніж розмір початкових даних. Також, з дескрипторами набагато легше працювати, аніж з растровими зображеннями. Для двох дескрипторів особливих точок представимо рейтинг схожості - метрику, яка визначатиме подібність двох векторів. Зазвичай, це норма L2 чи відстань Хеммінга (залежить від виду використаного дескриптора).

Atronax 19.02.21 в 13:33

0

Алгоритми пошуку дескрипторів особливих точок походять від базового класу cv::DescriptorExtractor. Подібним чином до методів розпізнавання, вони можуть бути створені з визначенням назви або явним викликом конструктора.

Atronax 19.02.21 в 13:35

0

Визначаємо об'єкт шаблона

Atronax 19.02.21 в 13:35

0

Для опису об'єкта шаблона використаємо клас Pattern, який вміщуватиме тренувальне зображення, список особливих точок та здобутих дескрипторів, а також 2D-3D відповідності для початкової позиції шаблона:
/**
* Зберігаємо дані зображення та знайдені дескриптори цільового шаблона
*/
struct Pattern
{
cv::Size size;
cv::Mat data;
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
std::vector<cv::Point2f> points2d;
std::vector<cv::Point3f> points3d;
};

Atronax 19.02.21 в 13:39

0

Перевіряємо особливі точки на співпадіння

Atronax 19.02.21 в 13:39

0

Процес знаходження покадрових відповідностей можна сформулювати як пошук найближчого сусіда серед одного набору дескрипторів для кожного елемента з іншого набору. Це так звана процедура "пошуку співпадінь". У бібліотеці OpenCV існує два головні алгоритми:
Повний перебір (cv::BFMatcher)
Апроксимація найближчих сусідів Flann (cv::FlannBasedMatcher)

Atronax 20.02.21 в 08:41

0

Перший спосіб шукає кожен дескриптор у першому наборі та найближчий до нього в другому, перевіряючи кожну пару по черзі (вичерпний пошук), у той час як cv::FlannBasedMatcher для пошуку відповідностей застосовує алгоритм швидкої апроксимації найближчого сусіда (для цього використовується окрема бібліотека).

Atronax 20.02.21 в 08:53

0

Результатом процесу є список відповідностей між двома наборами дескрипторів. Перший частіше за все називають тренувальним, адже від відповідає зображенню шаблона. Другий відомий під назвою набору запиту, оскільки він належить зображенню, на якому здійснюється пошук об'єкта. Чим більше коректних співпадінь знайдемо (існує більше відповідностей між шаблоном та зображенням), тим більше шансів, що потрібний об'єкт присутній на кадрі.

Atronax 20.02.21 в 08:59

0

Щоб прискорити процедуру, можна заздалегідь натренувати пошук співпадінь за допомогою функції match. Даний етап можна використати для оптимізації продуктивності cv::FlannBasedMatcher. З цією метою тренувальний клас сформує дерева індексів для дескрипторів. Це сприятиме більш швидкому пошуку співпадінь для великих наборів даних (наприклад, якщо потрібно порівняти сотні зображень). Для cv::BFMatcher відповідний клас не робить нічого, адже даних для обробки не існує; він всього лише зберігає тренувальні дескриптори у внутрішніх полях.

Atronax 20.02.21 в 09:24

0

PatternDetector.cpp
Наступний блок тренує пошук співпадінь з використанням шаблонного зображення:
void PatternDetector::train(const Pattern& pattern)
{
// Зберігаємо об'єкт шаблона
m_pattern = pattern;
// Програмний інтерфейс cv::DescriptorMatcher має нюанси
// Спершу очищаємо старі тренувальні дані:
m_matcher->clear();
// Потім додаємо вектор дескрипторів
// (кожна матриця описує одне зображення).
// Це дозволяє здійснювати пошук на декількох кадрах:
std::vector<cv::Mat> descriptors(1);
descriptors[0] = pattern.descriptors.clone();
m_matcher->add(descriptors);
// Після завантаження даних здійснюємо власне тренування:
m_matcher->train();
}

Atronax 20.02.21 в 09:31

0

Щоб знайти співпадіння серед дескрипторів запиту, застосуємо один з наступних методів cv::DescriptorMatcher:
Пошук простого списку найкращих відповідностей:
void match(const Mat& queryDescriptors, vector<DMatch>&
matches,
const vector<Mat>& masks=vector<Mat>() );
Виокремлення K найближчих співпадінь з кожним дескриптором:
void knnMatch(const Mat& queryDescriptors,
vector<vector<DMatch> >& matches, int k, const vector<Mat>&
masks=vector<Mat>(),bool compactResult=false );
Визначення відповідностей, чиї відстані не більші за вказану:
void radiusMatch(const Mat& queryDescriptors,
vector<vector<DMatch> >& matches, maxDistance, const
vector<Mat>& masks=vector<Mat>(), bool compactResult=false );

Atronax 20.02.21 в 09:36

0

Видаляємо зайві точки

Atronax 20.02.21 в 09:37

0

Під час етапу порівняння можуть траплятися невірні співпадіння. Це нормально. Існує два типи помилок:
Хибна поява, при якій відповідності визначені неправильно.
Хибна відсутність, якщо особливі точки видно на обох зображеннях, але вони не знаходяться.

Atronax 20.02.21 в 09:43

0

Хибна відсутність співпадінь - це, звичайно, суттєвий недолік. Але рішення проблеми немає, адже алгоритм їх не врахував. Нашою метою є лише мінімізація кількості хибних появ. Щоб видалити невірні відповідності, можна скористатися технікою перехресної перевірки. Ідея полягає в порівнянні тренувальних дескрипторів з набором запиту та навпаки. У цьому разі результатом будуть виключно спільні співпадіння. Така техніка зазвичай формує кращі результати з мінімальною кількістю зайвих точок у випадку достатньої кількості співпадінь.

Atronax 20.02.21 в 10:24

0

Фільтруємо перехресні співпадіння

Atronax 20.02.21 в 10:27

0

Ця процедура доступна в класі cv::BFMatcher. Щоб під'єднати перехресну перевірку, створимо об'єкт cv::BFMatcher з другим аргументом true:
cv::Ptr<cv::DescriptorMatcher> matcher(new
cv::BFMatcher(cv::NORM_HAMMING, true));
Результат використання перехресних перевірок показаний на наступному скріншоті:
Перевірка відношень
Іншою відомою технікою видалення зайвих точок є перевірка відношень. У цьому випадку здійснюємо пошук KNN-співпадінь спершу для K=2. Для кожного з них повертається два найближчі дескриптори, причому лише за умови, що відношення відстані між першим та другим співпадінням достатньо велике (зазвичай поріг рівний близько 2).

Atronax 20.02.21 в 10:42

0

PatternDetector.cpp
Код здійснює пошук співпадінь дескрипторів шляхом перевірки відношень:
void PatternDetector::getMatches(const cv::Mat& queryDescriptors,
std::vector<cv::DMatch>& matches)
{
matches.clear();
if (enableRatioTest)
{
// Щоб уникнути значення NaN для найкращого співпадіння з
// нульовою відстанню, скористаємось оберненим відношенням.
const float minRatio = 1.f / 1.5f;
// функція KNN поверне два найближчих
// співпадіння для кожного дескриптора запиту
m_matcher->knnMatch(queryDescriptors, m_knnMatches, 2);
for (size_t i=0; i<m_knnMatches.size(); i++)
{
const cv::DMatch& bestMatch = m_knnMatches[i][0];
const cv::DMatch& betterMatch = m_knnMatches[i][1];
float distanceRatio = bestMatch.distance /
betterMatch.distance;
// Повернемо лише ті, для яких відношення відстані
// між найближчими співпадіннями більше за 1.5
// (критерій розбіжності)
if (distanceRatio < minRatio)
{
matches.push_back(bestMatch);
}
}
}
else
{
// Виконуємо звичайну перевірку
m_matcher->match(queryDescriptors, matches);
}
}

Atronax 20.02.21 в 11:15

0

Тест відношень здатний видалити практично всі зайві точки. Але в деяких випадках хибні появи можуть проходити його. У наступній частині розділу покажемо, як видалити їх та залишити лише коректні співпадіння.

Atronax 20.02.21 в 11:16

0

Оцінюємо гомографію

Atronax 20.02.21 в 11:17

0
Минутку...

Следующая страница →