Корекція Keystone за допомогою 3D-точок Kinect


15

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

Мій перший підхід полягав у тому, щоб зробити все у 2D: Спочатку обчислити перспективне перетворення (за допомогою OpenCV warpPerspective()) від відсканованих точок до точок внутрішнього прямокутника та застосувати зворотну до прямокутника. Це здавалося, що працює, але надто повільно, оскільки його не вдалося вивести на GPU.

Другий підхід полягав у тому, щоб зробити все в 3D, щоб використовувати функції візуалізації XNA. По-перше, я б показав площину, просканував би її кути за допомогою Kinect і відзначив отримані 3D-точки на початкову площину. Теоретично я міг застосувати зворотну перспективу перетворення до площини, як це робив у 2D-підході. Однак, оскільки XNA працює з матрицею перегляду та проекції, я не можу просто викликати таку функцію, як warpPerspective()і отримати бажаний результат. Мені потрібно обчислити нові параметри для матриці перегляду та проекції камери.

Запитання: Чи можна обчислити ці параметри та розділити їх на дві матриці (подання та проекція)? Якщо ні, чи є інший підхід, який я міг би використати?


1
XNA використовує матрицю View і Projection, але я думаю, що кінцевий результат = вектор * view * проекція. Чому б не спробувати зробити матрицю тотожності та проекцію зворотною перспективною матрицею і не перевірити, чи працює це? (Не на 100% впевнений, що саме так і відбувається)
Рой Т.

1
Як саме ви обчислили перспективну трансформацію warpPespective? Я не знайомий з OpenCV, але читаючи документ, схоже, ця функція просто застосовує перспективу до зображення. Або я розгублений? У будь-якому випадку, можливо, допоможе додати більше деталей щодо вашої першої реалізації.
Лоран Кувіду

Ви можете поглянути на бібліотеку PCL ( pointclouds.org ). Перетворення зображення на глибині з кінекта дає хмару точок із камерою біля початку, вказуючи вздовж осі z. Потім ви можете використовувати ransac або інший алгоритм для пошуку літака.
Вихід

Відповіді:


1

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

введіть тут опис зображення

Враховуючи точку проектора (P), проектовану точку (B), одну довільну точку на площині, яка містить спотворений прямокутник (Q), і нормальний вектор до цієї площини (n), точку перетину (A) прямій від P до B, а площину задано через

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

Джерело http://geomalgorithms.com/a05-_intersect-1.html розділ Перетин прямолінійного перетину

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.