Коррекция трапецеидальных искажений с использованием 3D-очков Kinect

15

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

Мой первый подход состоял в том, чтобы сделать все в 2D: сначала вычислить преобразование перспективы (используя OpenCV warpPerspective()) из отсканированных точек в точки внутреннего прямоугольника и применить обратное к прямоугольнику. Казалось, это сработало, но было слишком медленно, поскольку его нельзя было отрендерить на GPU.

Второй подход состоял в том, чтобы сделать все в 3D, чтобы использовать возможности рендеринга XNA. Сначала я отображал плоскость, сканировал ее углы с помощью Kinect и отображал полученные 3D-точки в исходную плоскость. Теоретически я мог бы применить обратное преобразование перспективы к плоскости, как я это делал в 2D-подходе. Однако, поскольку XNA работает с матрицей вида и проекции, я не могу просто вызвать такую ​​функцию, как warpPerspective()и получить желаемый результат. Мне нужно было бы вычислить новые параметры для матрицы вида и проекции камеры.

Вопрос: можно ли рассчитать эти параметры и разбить их на две матрицы (вид и проекция)? Если нет, есть ли другой подход, который я мог бы использовать?

philllies
источник
1
XNA использует матрицу вида и проекции, но я думаю, что конечный результат = вектор * вид * проекция. Почему бы не попытаться сделать просмотр матрицы тождества и проекции матрицей обратной перспективы и посмотреть, работает ли это? (Не уверен на 100%, что именно так и происходит)
Рой Т.
1
Как именно вы вычислили перспективное преобразование warpPespective? Я не знаком с OpenCV, но, читая документ, похоже, что эта функция просто применяет перспективу к изображению. Или я в замешательстве? В любом случае, возможно, добавление более подробной информации о вашей первой реализации поможет.
Лоран Кувиду
Возможно, вы захотите взглянуть на библиотеку PCL ( pointclouds.org ). Преобразование изображения глубины из kinect дает вам облако точек с камерой в начале координат, направленной вдоль оси z. Затем вы можете использовать ransac или другой алгоритм для поиска самолета.
Exilyth

Ответы:

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 раздел Пересечение линия-плоскость

rraallvv
источник