Предположим, у вас есть две камеры - камера 1 и камера 2.
Для каждой камеры j = 1, 2 вам дается:
Расстояние hj
между его центром Oj
, (является ли «фокусная точка» правильным термином? В основном точка Oj
, с которой камера смотрит на свой экран) и экраном камеры. Система координат камеры расположена по центру Oj
, оси Oj--->x
и Oj--->y
параллельны экрану, а ось Oj--->z
перпендикулярна экрану.
Матрица вращения 3 x 3 Uj
и вектор перевода 3 x 1 Tj
, который преобразует декартовы трехмерные координаты относительно системы камеры j (см. Точку 1) в мировые координаты, то есть координаты относительно третьей системы координат, из которой описаны все точки в трехмерном мире.
На экране камеры j, которая является плоскостью, параллельной плоскости Oj-x-y
и на расстоянии hj
от начала координат Oj
, у вас есть 2D-координаты (скажем, x, y только координаты) точки pj
, где две точки p1
и p2
фактически являются проецируемыми изображениями одной и той же точки P
, где-то в 3D, на экраны камеры 1 и 2 соответственно. Проекция получается путем рисования 3D-линии между точкой Oj
и точкой P
и определения точки pj
в качестве уникальной точки пересечения этой линии с экраном камеры j. Уравнение экрана в трехмерной системе координат камеры j составляет z = hj
, поэтому координаты точки pj
относительно трехмерной системы координат камеры j выглядят как pj = (xj, yj, hj)
, поэтому двумерные координаты экрана просто pj = (xj, yj)
,
Ввод: Вам даны 2D-точки p1 = (x1, y1), p2 = (x2, y2)
, фокусные расстояния двух камер h1, h2
, две матрицы вращения 3 x 3 U1
и U2
, два перевода 3 x 1 векторные столбцы T1
и T2
.
Вывод: Координаты P = (x0, y0, z0)
точки P в мировой системе координат.
Одним из несколько простых способов сделать это, избегая однородных координат и проекционных матриц (что тоже хорошо и более или менее эквивалентно), является следующий алгоритм:
Форма Q1 = [x1; y1; h1]
и Q2 = [x2; y2; h2]
, где они интерпретируются как 3 x 1 векторных столбца;
Преобразование P1 = U1*Q1 + T1
и P2 = U1*Q2 + T1
, где *
- матричное умножение, здесь это матрица 3 x 3, умноженная на столбец 3 x 1, с учетом столбца 3 x 1;
Формируют линии X = T1 + t1*(P1 - T1)
и X = T2 + t2*(P2 - T2)
;
Две линии из предыдущего шага 3 либо пересекаются в общей точке, которая является точкой P
, либо они являются косыми линиями, то есть они не пересекаются, но не параллельны (не копланарны).
Если линии - это наклонные линии, найдите уникальную точку X1
в первой строке и уникальную точку X2
во второй строке, чтобы вектор X2 - X1
был перпендикулярен обеим линиям, т. Е. X2 - X1
перпендикулярно обоим векторам P1 - T1
и P2 - T2
. Эти две точки X1 и X2 являются ближайшими точками на двух линиях. Тогда точка P = (X1 + X2)/2
может быть взята за середину отрезка X1 X2
.
В общем, две линии должны проходить очень близко друг к другу, поэтому две точки X1 и X2 должны быть очень близко друг к другу.