Матрица проекции от 3D до 2D - PullRequest
16 голосов
/ 25 сентября 2008

У меня есть 3 точки в трехмерном пространстве, из которых я знаю точное местоположение. Предположим, что они: (x0,y0,z0), (x1,y1,z1) и (x2,y2,z2).

Также у меня есть камера, которая смотрит на эти 3 точки, и я знаю 2D расположение этих трех точек на плоскости обзора камеры. Так, например, (x0,y0,z0) будет (x0',y0'), а (x1,y1,z1) будет (x1',y1'), а (x2,y2,z2) будет (x2',y2') с точки зрения камеры.

Какой самый простой способ найти матрицу проекции, которая будет проецировать эти 3D-точки в 2D-точки на плоскости обзора камеры. Мы ничего не знаем о местоположении камеры.

Ответы [ 4 ]

12 голосов
/ 25 сентября 2008

Это дает вам два набора, каждое из трех уравнений в 3 переменных:

a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

Просто используйте любой метод решения одновременных уравнений, который проще всего в вашей ситуации (даже не трудно решить их «вручную»). Тогда ваша матрица преобразования просто ((a, b, c) (d, e, f)).

...

На самом деле, это слишком упрощенно и предполагает, что камера направлена ​​на начало вашей трехмерной системы координат и не имеет перспективы.

Для перспективы матрица преобразования работает более похоже на:

               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

но матрица 4x3 более ограничена, чем 12 степеней свободы, так как мы должны иметь

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

Таким образом, у вас, вероятно, должно быть 4 точки, чтобы получить 8 уравнений для покрытия 6 переменных для положения и угла камеры и еще 1 для масштабирования двумерных точек обзора, поскольку мы сможем устранить "центральные" координаты ( хс, ус).

Таким образом, если у вас есть 4 точки и вы трансформируете свои 2-D точки обзора относительно центра вашего дисплея, то вы можете получить 14 одновременных уравнений по 13 переменным и решить.

К сожалению, шесть уравнений не являются линейными уравнениями. К счастью, все переменные в этих уравнениях ограничены значениями от -1 до 1, поэтому, вероятно, все еще возможно решить уравнения.

3 голосов
/ 25 сентября 2008

Ваша камера имеет (как минимум) 7 степеней свободы - 3 для положения, 3 для ориентации и 1 для FOV. Я уверен, что кто-то исправит меня, если я ошибаюсь, но кажется, что 3 балла недостаточно для полного решения.

Обобщенное решение этой проблемы см. В разделе «Просмотр корреляции» в Graphics Gems II.

2 голосов
/ 14 февраля 2011

То, что вы ищете, называется алгоритмом оценки поз. Посмотрите на реализацию POSIT в OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

Вам понадобится четыре или более очков, и они могут не находиться в одной плоскости.

Учебник для этой реализации находится здесь: http://opencv.willowgarage.com/wiki/Posit

Будьте осторожны: в учебнике используется квадратный видовой экран, поэтому все координаты вида находятся в диапазоне от -1, -1 до 1,1. Это приводит к предположению, что они должны быть в системе координат камеры (до коррекции соотношения сторон). Это не так, поэтому, если вы используете окно просмотра, например, с. соотношение сторон 4: 3, тогда ваши входные координаты должны быть в диапазоне от -1,3333, от -1 до 1,3333,1.

Кстати, если ваши точки должны лежать в одной плоскости, то вы также можете взглянуть на алгоритм CameraCalibration из OpenCV, но это более сложная настройка и требует больше точек в качестве входных данных. Однако это также даст вам информацию об искажении и внутренние параметры вашей камеры.

0 голосов
/ 25 сентября 2008

Не думаю, что информации достаточно, чтобы найти окончательное решение. Не зная местоположения вашей камеры и не зная плоскости вашего обзора, существует бесконечное количество матриц, которые могут решить эту проблему.

...