Ваша формула выглядит правильной, однако, чтобы она сохранялась по всей плоскости изображения, сначала следует исправить искажения объектива, например, следуя ответу
Калибровка камеры, обратная проекция пикселяв направлении
По пути модуль калибровки объектива OpenCV оценит ваше истинное фокусное расстояние.
Заполнение формулы дает
Distance = 3.67 mm * 180 mm * 1080/511 / sensor_height_mm = 1396 mm^2 / sensor_height_mm
Оставив sensor_height_mm
неизвестно,Учитывая, что ваша камера имеет формат 16: 9
w^2 + h^2 = D^2
(16x)^2+(9x)^2 = D^2
<=>
x = sqrt( D^2/337 )
<=>
h = 9x = 9*sqrt( D^2/337 )
Помните Правило 16 :
https://photo.stackexchange.com/questions/24952/why-is-a-1-sensor-actually-13-2-%C3%97-8-8mm/24954
Наиболее важно, 1 /2,88 "сенсор имеет диаметр круга изображения 16 / 2,88 мм вместо 25,4 / 2,88 мм. Достаточно забавно, что истинный диаметр круга изображения является метрическим. Таким образом, диаметр датчика составляет
D = 16 mm/ 2.88 = 5.556 mm
и
sensor_height_mm = h = 2.72 mm
давая
Distance = 513 mm
Обратите внимание, что это расстояние измеряется относительно первой главной точки объектива, а не положения датчика или положения переднего элемента объектива.
По мере исправленияискажение барреля, показания должны стать более точными. Это довольно много для этой камеры. У меня есть подобное.
Надеюсь, что это помогает.