Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 4. Побудова структури з руху на основі OpenCV
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Відновлюємо сцену Atronax 25.02.21 в 11:17 |
|
|
Далі розглянемо процес відновлення 3D структури сцени з отриманих дотепер даних. Як раніше, маємо звернути увагу на інструменти та наявні дані. У попередній частині ми здобули дві матриці камер з базової та фундаментальної, а також обговорили як використати ці інструменти для пошуку відповідної тривимірної позиції в просторі. Далі, повернемось до співпадінь, щоб заповнити рівняння числовими даними. Пари точок будуть також корисні для пошуку похибок наближених обчислень. Atronax 25.02.21 в 11:24 |
||
|
Час пояснити, як саме здійснювати триангуляцію за допомогою OpenCV. Цього разу слідуватимемо крокам Хартлі та Штурма, описаними в статті "Триангуляція", у якій вони реалізують та порівнюють декілька методів. Ми запрограмуємо один з лінійних способів, оскільки це можна легко зробити за рахунок можливостей бібліотеки. Atronax 25.02.21 в 11:57 |
||
|
Пам'ятаєте, ми мали два ключові рівняння для співпадіння двовимірних точок та матриць P: x = PX та x'= Atronax 25.02.21 в 12:04 |
||
|
Mat_<double> LinearLSTriangulation( Atronax 25.02.21 в 12:05 |
||
|
В результаті отримаємо наближене положення позиції у 3D просторі, пов'язаної з парою двовимірних точок. Варто зауважити, що останні представлені гомогенними координатами, а це значить, що до значень x та y додається одиниця. Маємо впевнитись, що точки мають нормалізовані координати, тобто вони були заздалегідь помножені на матрицю калібрування K. Замість пошуку добутку кожної на матрицю K можна просто використати KP (добуток матриць K та P), як пропонують Х. та З. у розділі 9. Запрограмуємо цикл по співпадінням точок, щоб отримати повну триангуляцію так: Atronax 25.02.21 в 12:14 |
||
|
double TriangulatePoints( Atronax 25.02.21 в 12:16 |
||
|
Далі зображено результат триангуляції на основі двох знімків фонтану, що доступні за адресою http://cvlab.epfl.ch/~strecha/multiview/denseMVS.html. У верхній частині зображено два початкові види сцени, а в нижній - вид на реконструйовану хмару точок з двох позицій, включно зі знайденими камерами, що спрямовані на фонтан. Можна бачити, як відновлено частину червоної цегляної стіни, а також вбудований фонтан. Atronax 25.02.21 в 12:24 |
||
|
Однак, як вже сказано раніше, існує проблема залежності реконструкції від змін масштабу. Зупинимось на цьому моменті на певний час. Рух між двома камерами матиме певний спосіб вимірювання, тобто не сантиметри чи дюйми, а просто якусь задану міру масштабу. Відновлені камери знаходитимуться на відстані, що відповідає одиниці за нею. Це важливо для подальших дій, коли матимемо відновити більше камер, оскільки кожна пара має власні характеристики масштабування, а не спільні для всіх. Atronax 25.02.21 в 12:30 |
||
|
Тепер розглянемо, як саме вимірювання похибки допомагає знайти більш точну реконструкцію. Варто зауважити, репроєкція означає вибір триангульованої тривимірної позиції та її проєкцію на площину камери з метою отримати відповідну двовимірну. Потім оцінюємо відстань між початковою та проєктованою точками. Якщо вона велика, можлива помилка триангуляції, тому таку точку не беремо до уваги. Глобальним виміром є середня відстань репроєкції, яка вказуватиме на загальну якість триангуляції. Її високе значення може вказувати на недоліки P, а, отже, й на можливі помилки в обчисленні базової матриці співвідносних ключових точок. Atronax 25.02.21 в 13:13 |
||
|
Повернімось до обговорення матриць камери з попередньої частини. Ми вказали, що побудову матриці P1 можна здійснити чотирма різними способами, але лише один з них формує коректний результат. Знаючи як триангулювати точку, реалізуємо пошук дійсної матриці. На даному етапі пропустимо деталі реалізації, оскільки вони наведені в коді, доданому до книги. Atronax 25.02.21 в 13:18 |
||
|
Відновлюємо сцену з багатьох видів Atronax 25.02.21 в 13:18 |
||
|
Ми вже відновили рух та геометрію сцени з двох камер. Здавалося б, не так важко додати інші камери та точки, віднайти їхні характеристики, просто застосувавши той же процес. Але в дійсності це не так просто, адже ми можемо отримати лише реконструкцію, залежну від змін масштабів, а кожна пара зображень дає різні його значення. Atronax 25.02.21 в 13:24 |
||
|
Існує кілька способів коректно відновити дані тривимірної сцени з декількох видів. Перший - це зміна та оцінка пози камери, відоме як перспективна N-точка (PNP), згідно з яким намагатимемось знайти позицію на основі вже знайдених точок сцени. Інший спосіб - триангулювати більше 2D позицій та поглянути на їх взаємне розміщення на геометрії сцени: це надасть інформацію про положення нової камери за рахунок використання ітеративної найближчої точки (ICP). У цьому розділі розглянемо, як застосувати функції solvePnP бібліотеки OpenCV для реалізації першого варіанту. Atronax 25.02.21 в 13:36 |
||
|
На початковому кроці поступової 3D реконструкції зі зміною положення камери маємо отримати базову структуру сцени. Оскільки ми шукатимемо позицію будь-якого нового виду залежно від відомої структури сцени, варто знайти початкову структуру та базис. Можна скористатися попередньо вказаним методом - наприклад, для першого та другого кадрів - щоб отримати дані для пошуку матриць камери (з використанням функції FindCameraMatrices) та триангуляції геометрії (за допомогою TriangulatePoints). Atronax 25.02.21 в 13:37 |
||
|
Отримавши початкову структуру, можна продовжити процес; однак, метод вимагає дотримуватись певних обмежень. По-перше, варто зауважити, що функція solvePnP потребує два вирівнені вектори 3D та 2D точок. Це значить, що i-тий елемент в одному збігається з i-тим в іншому. Щоб віднайти їх, маємо оглянути точки навколо отриманої раніше тривимірної точки, що відноситься до двовимірної на нашому кадрі. Простий спосіб досягти цього - до кожної 3D позиції хмари доєднати вектор 2D точок, з яких вона здобута. Потім можна застосувати процес співпадіння особливих точок, щоб знайти необхідну пару. Atronax 25.02.21 в 13:57 |
||
|
Познайомимось з новою структурою: Atronax 25.02.21 в 14:01 |
||
|
std::vector<CloudPoint> pcloud; //глобальна хмара тривимірних точок Atronax 25.02.21 в 14:06 |
||
|
// індекс співпадіння 2D точки в <old_view> Atronax 25.02.21 в 14:11 |
||
|
cv::Mat_<double> t,rvec,R; Atronax 25.02.21 в 14:11 |
||
|
Використовуючи функцію solvePnPRansac замість solvePnP, отримаємо менше зайвих точок. Маючи нову матрицю P1, можна просто викликати функцію TriangulatePoints, визначену раніше, та населити хмару більшою кількістю тривимірних точок. Далі, починаючи з 4-го малюнку, зображено поступову реконструкцію сцени фонтану з ресурсу http://cvlab.epfl.ch/~strecha/multiview/denseMVS.html. Верхнє ліве зображення - це результат відновлення сцени на основі 4 використаних кадрів; камери позначені червоними пірамідами та білими лініями, що вказують напрям. Решта зображень показують, як інші види формують додаткові точки хмари. Atronax 25.02.21 в 14:18 |
||
|
Уточнюємо реконструкцію Atronax 25.02.21 в 14:18 |
||
|
Одним із найважливіших етапів побудови структури з руху є уточнення та оптимізація відновленої сцени, також відоме як процес регулювання груп (BA). Це крок, на якому всі зібрані дані підлаштовуються під певну монолітну модель. Оптимізуються положення і точок, і камери, тому похибки репроєкції мінімізовані (тобто, апроксимовані 3D точки проєктуються на зображення поряд з врахованими двовимірними). Зазвичай, цей процес включає пошук розв'язків досить великих лінійних рівнянь з десятками тисяч параметрів. Можливо, це потребуватиме важкої роботи, але зроблені раніше кроки дозволять легко інтегрувати регулювання груп. Деякі речі, які раніше видавалися дивними, стануть більш зрозумілими; наприклад, причина того, чому ми зберігаємо початкові двовимірні точки для кожної тривимірної у хмарі. Atronax 26.02.21 в 09:02 |
||
|
Серед реалізацій відповідних алгортимів виділяють бібліотеку простого розрідженого регулювання груп (SSBA); використаємо саме його через простоту програмного інтерфейсу. Він потребує лише декілька вхідних аргументів, які можна доволі легко отримати з наявних структур даних. Перш за все нас цікавить фукнція CommonInternalsMetricBundleOptimizer, що здійснює власне оптимізацію. Їй потрібні внутрішні параметри камери, хмара тривимірних точок та відповідні їм двовимірні, спрямовані на сцену камери. Як саме отримати ці дані, вже відомо. Маємо відмітити, даний метод припускає, що всі зображення зняті одним пристроєм і мають однакові внутрішні параметри, інші способи можуть не враховувати ці обмеження. Здійснити регулювання груп можна таким чином: Atronax 26.02.21 в 09:21 |
||
|
void BundleAdjuster::adjustBundle( Atronax 26.02.21 в 09:23 |
||
|
// хмара 3D точок Atronax 26.02.21 в 09:25 |
||
|
for (inti = 0; i< N; ++i) Atronax 26.02.21 в 09:25 |
||
|
// відповідні двовимірні точки Atronax 26.02.21 в 09:29 |
||
|
} Atronax 26.02.21 в 09:31 |
||
|
Не зважаючи на довжину коду, в основному здійснюється конвертація внутрішніх структур даних у відповідні, затребувані бібліотекою SSBA, і навпаки, а також активується процес оптимізації. Atronax 26.02.21 в 09:43 |
||
|
Використовуємо PCL для візуалізації хмари тривимірних точок Atronax 26.02.21 в 09:43 |
||
|
Працюючи з 3D даними, важко швидко зрозуміти, чи є результат коректним, просто поглянувши на виміри похибок репроєкції чи грубу інформацію про точки. З іншого боку, дивлячись на власне хмару, можна негайно підтвердити її правильність чи наявність помилок. Для візуалізації застосуємо сестринський проєкт OpenCV, що називають бібліотекою хмар точок (PCL). Вона постачає множину іструментів для візуалізації та аналізу хмар, наприклад пошук плоских поверхонь, співпадіння, сегментацію об'єктів та видалення зайвих елементів. Ці методи досить корисні, якщо нас цікавить не так хмара, як інформація вищого рівня про тривимірну модель. Atronax 26.02.21 в 09:49 |
||
|
По-перше, маємо представити хмару (по суті, список тривимірних точок) у вигляді структур даних PCL. Це можна зробити так: Atronax 26.02.21 в 09:53 |
||
|
// перевіряємо на наявність помилкових координат (NaN, Inf і так далі) Atronax 26.02.21 в 09:55 |
||
|
Щоб зробити візуалізацію зручнішою для аналізу, можна використати відповідні значення RGB зображень. Також до грубої хмари можна застосувати фільтр, який видалить очевидні зайві точки за допомогою нструменту статистичного видалення зайвих точок (SOR) таким чином: Atronax 26.02.21 в 09:58 |
||
|
void SORFilter() { Atronax 26.02.21 в 10:24 |
||
|
Тепер можемо використати програмний інтерфейс PCL для простої візуалізації хмари таким чином: Atronax 26.02.21 в 10:27 |
||
|
Наступна іллюстрація зображає результат використання інструменту статистичного видалення зайвих точок. Зліва показано початкову хмару, сформовану алгоритмом структури з руху, включно з положенням камери та наближеним видом певної її частини. Справа зображено фільтровану, після використання операції SOR. Можна бачити, які саме зайві точки видалено, а хмара стала чистішою: Atronax 26.02.21 в 13:52 |
||
|
Використовуємо код прикладу Atronax 26.02.21 в 13:53 |
||
|
Приклад застосування SfM постачається разом з цією книгою. Поглянемо, як можна скомпілювати, запустити програму та скористатися її виводом. Для цього знадобиться CMake, кросплатформове середовище побудови, подібне до Maven чи SCons. Також необхідно забезпечити виконання таких вимог: Atronax 26.02.21 в 13:59 |
||
|
Спочатку маємо налаштувати середовище побудови. Для цього можна створити теку з назвою "build", яка зберігатиме всі потрібні файли; далі вважатимемо, що всі операції командної стрічки знаходяться в ній, хоча процес не змінюється, навіть якщо не користуватися цією текою (важливе лише розміщення файлів). Atronax 26.02.21 в 14:07 |
||
|
Маємо впевнитися, що CMake знаходить SSBA та PCL. Якщо PCL встановлено правильно, проблем бути не має; однак, потрібно встановити коректне розміщення встановленої бібліотеки SSBA як значення параметра побудови DSSBA_LIBRARY_DIR. Якщо операційною системою є Windows, для побудови можна використати Microsoft Visual Studio; для цього виконаємо таку команду: Atronax 26.02.21 в 14:13 |
||
|
CMake також здатна створювати макроси для Eclipse, Codeblocks та інших IDE. Коли закінчиться формування середовища, приступимо й до побудови рішення. В Unix-подібній системі можна просто скористатися утилітою make, в інших випадках достатньо застосувати процес побудови певного середовища розробки. Коли побудова завершиться, в результаті отримаємо файл ExploringSfMExec, який покаже в дії процес SfM. Запустивши його без аргументів, отримаємо наступну стрічку: USAGE: ./ExploringSfMExec <path_to_images> Atronax 26.02.21 в 14:34 |
||
|
Щоб застосувати алгоритм для набору зображень, маємо вказати їх розміщення на диску. Якщо вхідні дані дійсні, має розпочатися процес, і ми побачимо на екрані прогрес та інформацію налагодження. В результаті отримаємо набір тривимірних точок, що відповідає використаним зображенням. Натискаючи 1 чи 2, можна змінювати режим між уточненою та неуточненою хмарою. Atronax 26.02.21 в 14:50 |
||
|
Висновки Atronax 26.02.21 в 14:14 |
||
|
У цьому розділі ми побачили, яким саме чином OpenCV допомагає побудувати структуру з руху в спосіб, який легко закодувати та зрозуміти. Програмний інтерфейс бібліотеки включає набір корисних функцій та структур даних, які полегшують життя та спрощують реалізацію. Atronax 26.02.21 в 15:02 |
||
|
Якщо потрібно розширити та поглибити знання про відновлення структури з руху, можна відшукати їх в інших відкритих тематичних бібліотеках. Особливо цікавим проєктом є libMV, що реалізує широкий масив елементів SfM, взаємозамінних задля кращих результатів. Існує також декілька праць Університету Вашингтона, в яких описані інструменти для багатьох сфер SfM (Bundler та VisualSfM). Ця праця надихнула розробників онлайн продукту Microsoft під назвою PhotoSynth. В мережі доступні й інші реалізації SfM, достатньо лише віднайти їх. Atronax 26.02.21 в 15:24 |
||
|
Ще одним важливим фактом, який ми не обговорювали раніше, є взаємозв'язок SfM та VLM, краще відомий як методи одночасної локалізації та відображення (SLAM). У цьому розділі ми мали справу із заданим набором зображень та послідовністю відеокадрів, застосування SfM доречне в таких випадках; але деякі програми не мають попередньо записаних наборів даних та мають проводити реконструкцію в режимі реального часу. Цей процес відомий як відображення, він застосований для створення 3D карти світу на основі співпадіння ключових точок, відслідковування у 2D просторі, та триангуляції. Atronax 26.02.21 в 15:38 |
||
|
Посилання Atronax 26.02.21 в 14:14 |
