Как триангулировать точку в трехмерном пространстве, учитывая координаты точек в 2-м изображении и внешние значения камеры - PullRequest
1 голос
/ 18 апреля 2019

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

Мне знакома общая идея: каким-то образом создать два луча и найти ближайшую точку, которая удовлетворяет задаче наименьших квадратов, однако я не знаю точно, как преобразовать данную информацию в серию уравнений в координатная точка в 3D.

1 Ответ

0 голосов
/ 09 мая 2019

Предположим, у вас есть две камеры - камера 1 и камера 2.

Для каждой камеры j = 1, 2 вам дается:

  1. Расстояние hj между его центром Oj, (является ли «фокусная точка» правильным термином? В основном точка Oj, с которой камера смотрит на свой экран) и экраном камеры. Система координат камеры расположена по центру Oj, оси Oj--->x и Oj--->y параллельны экрану, а ось Oj--->z перпендикулярна экрану.

  2. Матрица вращения 3 x 3 Uj и вектор перевода 3 x 1 Tj, который преобразует декартовы трехмерные координаты относительно системы камеры j (см. Точку 1) в мировые координаты, то есть координаты относительно третьей системы координат, из которой описаны все точки в трехмерном мире.

  3. На экране камеры 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 в мировой системе координат.

Одним из несколько простых способов сделать это, избегая однородных координат и проекционных матриц (что тоже хорошо и более или менее эквивалентно), является следующий алгоритм:

  1. Форма Q1 = [x1; y1; h1] и Q2 = [x2; y2; h2], где они интерпретируются как 3 x 1 векторных столбца;

  2. Преобразование P1 = U1*Q1 + T1 и P2 = U1*Q2 + T1, где * - матричное умножение, здесь это матрица 3 x 3, умноженная на столбец 3 x 1, с учетом столбца 3 x 1;

  3. Формируют линии X = T1 + t1*(P1 - T1) и X = T2 + t2*(P2 - T2);

  4. Две линии из предыдущего шага 3 либо пересекаются в общей точке, которая является точкой P, либо они являются косыми линиями, то есть они не пересекаются, но не параллельны (не копланарны).

  5. Если линии - это наклонные линии, найдите уникальную точку X1 в первой строке и уникальную точку X2 во второй строке, чтобы вектор X2 - X1 был перпендикулярен обеим линиям, т. Е. X2 - X1 перпендикулярно обоим векторам P1 - T1 и P2 - T2. Эти две точки X1 и X2 являются ближайшими точками на двух линиях. Тогда точка P = (X1 + X2)/2 может быть взята за середину отрезка X1 X2.

В общем, две линии должны проходить очень близко друг к другу, поэтому две точки X1 и X2 должны быть очень близко друг к другу.

...