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