Как мне триангулировать 3d-координату из двух 2d-точек? - PullRequest
0 голосов
/ 01 мая 2020

Я работаю над проектом с двумя инфракрасными камерами позиционирования, которые выводят координаты (X, Y) любого ИК-источника. Я помещаю их рядом друг с другом, и моя цель состоит в том, чтобы измерить трехмерную координату (X, Y, Z) источника ИК-излучения, используя ту же технику, которую используют наши глаза для измерения глубины.

Я нарисовал (паршивый) набросок здесь

enter image description here

, который иллюстрирует то, что я пытаюсь вычислить. Красная точка - мой ИК-источник, который также можно увидеть на «видах» камеры справа. Я пытаюсь измерить длину синей линии.

У меня есть несколько известных переменных:

  • Камеры имеют разрешение 1024x768 (что также означает, что это является максимумом координаты (X, Y), упомянутой ранее)

  • По горизонтали поле обзора составляет 41 градус, по вертикали 31 градус.

  • I еще предстоит определиться с расстоянием между камерами (AB), но это будет известная переменная. Давайте сейчас сделаем 30 см.

К сожалению, я не могу найти фокусное расстояние камеры.

В конечном итоге я надеюсь на (X, Y , Z) координата относительно средней точки AB. Как бы я go об измерении (Z)?

1 Ответ

0 голосов
/ 05 мая 2020

Я не уверен, насколько хорошо выровнены ваши камеры, но из ваших снимков я начинаю предполагать, что камера A и камера B выровнены настолько хорошо, что прямоугольник, представляющий экран камеры B, представляет собой просто горизонтальный перевод прямоугольника, представляющего экран камеры А. Под этим я подразумеваю, что соответствующие края прямоугольников экранов параллельны друг другу, а два прямоугольных экрана angular l ie расположены в общей вертикальной плоскости, перпендикулярной земле. Теперь рассмотрим плоскость, параллельную вертикальной плоскости, которая содержит экраны двух камер и проходит через точки фокусировки A и B двух камер. Назовите этот последний самолет screen_plane. Кроме того, точки фокусировки A и B находятся на одинаковой высоте от земли. Если это так, и если я предполагаю, что c = |AB| - это расстояние между фокусными точками двух камер, и если я положу систему координат на A, чтобы ось x была горизонтальной относительно земли, ось y перпендикулярно земле, а ось z параллельна земле, но перпендикулярна экрану, тогда точка фокусировки камеры B будет иметь координаты ( c, 0, 0 ). В качестве примера вы привели c = 30 cm. Также screen_plane охватывает оси x и y, описанные выше, а ось z перпендикулярна screen_plane.

Если вы хотите работать с этой настройкой, то красная точка P появится на обоих экранах с одинаковыми координатами Y_A = Y_B, но разными координатами X_A и X_B. Затем обозначим theta горизонтальный угол поля зрения, который вы определили как theta = 41 deg. Просто чтобы прояснить, я предполагаю, что угол между самой левой стороной и самой правой стороной обзора равен 2 * theta = 82 deg.

Если я правильно понимаю, вы пытаетесь вычислить расстояние Z между вертикальной плоскостью screen_plane, который содержит фокусы камеры и плоскость, параллельную screen_plane и проходящую через красную точку P, т.е. вы пытаетесь вычислить расстояние от P до вертикальной плоскости screen_plane.

Тогда Вот как вы рассчитываете Z:

Шаг 1: Из изображения точки P на экране A рассчитайте расстояния (например, количество пикселей) от P до вертикальных краев экрана. Скажем, они dist_P_to_left_edge и dist_P_to_right_edge. Установите

a_A = dist_P_to_left_edge / (dist_P_to_left_edge + dist_P_to_right_edge) (this one is not really necessary)
b_A = dist_P_to_right_edge / (dist_P_to_left_edge + dist_P_to_right_edge)

Шаг 2: Сделайте то же самое с изображением точки P на экране B:

a_B = dist_P_to_left_edge / (dist_P_to_left_edge + dist_P_to_right_edge)
b_B = dist_P_to_right_edge / (dist_P_to_left_edge + dist_P_to_right_edge) (this one is not really necessary)

Шаг 3: Примените формулу:

Z = c * cot(theta) / (2 * (1 - b_A - a_B) )

Так, например, из предоставленных вами изображений экранов камеры A и B я измерил линейкой, что

b_A = 4/38
a_B = 12.5/38

и от данные, которые вы включили

theta = 41 deg
c = 30 cm

, поэтому я подсчитал, что длина синего сегмента на вашем изображении составляет

Z = 30 * cos(41*pi/180) / (sin(41*pi/180) * (1 - 4/38 - 12.5/38))
  = 60.99628 cm
...