2008-09-25 5 views
16

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

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

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

+0

Это не моя домашняя работа! – 2008-09-25 00:38:46

ответ

12

Это дает вам два набора, каждый из трех уравнений в 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)).

...

На самом деле, это слишком упрощенно и принимает камера указала на происхождение вашей 3D системы и никакой перспективы координат.

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

   (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; 

но матрица 4х3 более ограничена, чем 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 для масштабирования двумерных точек обзора, так как мы сможем устранить «центральные» координаты (xc, yc).

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

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

+0

Ваше решение, вероятно, было лучшим ответом, который я нашел в своей проблеме. Пожалуйста, опишите немного больше о второй части решения. что xv и yv также md и zt и xt yt zt. Большое спасибо – 2008-09-25 13:29:36

0

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

+0

Нет, он означает, что существует бесконечное количество матриц, которые выполняют то, что вы запрашиваете для заданного набора точек. Вам нужно либо больше очков, либо меньше свободы (например, зафиксировать FOV камеры), чтобы исправить это. – 2008-09-25 01:28:32

+0

Сколько очков мне нужно? – 2008-09-25 01:36:04

3

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

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

2

То, что вы ищете, называется алгоритмом оценки позы. Взгляните на реализацию 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, но это больше связано с настройкой и требует большего количества точек в качестве входных данных. Однако он также даст вам информацию об искажении и собственные параметры вашей камеры.