Матрица проекции 3d-2d
У меня есть 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-точки на плоскости обзора камеры. Мы ничего не знаем о местоположении камеры.
Ответы
Ответ 1
Это дает вам два набора, каждое из трех уравнений из трех переменных:
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 точки и трансформируйте ваши двумерные точки обзора относительно центра вашего дисплея, вы можете получить 14 синхронных уравнений в 13 переменных и решить.
К сожалению, шесть уравнений не являются линейными уравнениями. К счастью, все переменные в этих уравнениях ограничены значениями от -1 до 1, поэтому, вероятно, возможно решить уравнения.
Ответ 2
Ваша камера имеет (по крайней мере) 7 степеней свободы - 3 для позиции, 3 для ориентации и 1 для FOV. Я уверен, что кто-то исправит меня, если я ошибаюсь, но похоже, что для полного решения достаточно 3 баллов.
Для обобщенного решения этой проблемы найдите "Просмотр корреляции" в Graphics Gems II.
Ответ 3
То, что вы ищете, называется алгоритмом оценки позы. Взгляните на реализацию 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, но это больше связано с настройкой и требует большего количества точек в качестве входных данных. Однако он также даст вам информацию об искажении и собственные параметры вашей камеры.
Ответ 4
Я не думаю, что есть достаточно информации, чтобы найти окончательное решение. Не зная местоположения вашей камеры и не зная плоскости своего зрения, существует бесконечное количество матриц, которые могут решить эту проблему.