С помощью XNA я отображаю простой прямоугольник, который проецируется на пол. Проектор можно разместить в произвольном положении. Очевидно, проецируемый прямоугольник искажается в соответствии с положением и углом проектора. Kinect сканирует пол в поисках четырех углов. Теперь моя цель состоит в том, чтобы трансформировать исходный прямоугольник так, чтобы проекция больше не искажалась путем предварительной деформации прямоугольника.
Мой первый подход состоял в том, чтобы сделать все в 2D: сначала вычислить преобразование перспективы (используя OpenCV warpPerspective()
) из отсканированных точек в точки внутреннего прямоугольника и применить обратное к прямоугольнику. Казалось, это сработало, но было слишком медленно, поскольку его нельзя было отрендерить на GPU.
Второй подход состоял в том, чтобы сделать все в 3D, чтобы использовать возможности рендеринга XNA. Сначала я отображал плоскость, сканировал ее углы с помощью Kinect и отображал полученные 3D-точки в исходную плоскость. Теоретически я мог бы применить обратное преобразование перспективы к плоскости, как я это делал в 2D-подходе. Однако, поскольку XNA работает с матрицей вида и проекции, я не могу просто вызвать такую функцию, как warpPerspective()
и получить желаемый результат. Мне нужно было бы вычислить новые параметры для матрицы вида и проекции камеры.
Вопрос: можно ли рассчитать эти параметры и разбить их на две матрицы (вид и проекция)? Если нет, есть ли другой подход, который я мог бы использовать?
warpPespective
? Я не знаком с OpenCV, но, читая документ, похоже, что эта функция просто применяет перспективу к изображению. Или я в замешательстве? В любом случае, возможно, добавление более подробной информации о вашей первой реализации поможет.Ответы:
Поскольку векторная алгебра дружественна к графическому процессору, для поиска четырех углов исходной плоскости можно использовать нормализации и точечные произведения следующим образом:
Учитывая точку проектора (P), спроецированную точку (B), одну произвольную точку на плоскости, которая содержит искаженный прямоугольник (Q), и вектор нормали к этой плоскости (n), точку пересечения (A) линия от P до B, и плоскость задается как
Источник http://geomalgorithms.com/a05-_intersect-1.html раздел Пересечение линия-плоскость
источник