Да, необычно указывать несколько полей обзора. Для типичной камеры (квадратные пиксели, минимальное искажение, вектор обзора через центр изображения) обычно дается только один угол поля зрения - горизонтальный или вертикальный, поскольку другой может быть получен из соотношения сторон изображения.
Особенно удивительно указывать горизонтальный угол 48,6 и вертикальный угол 62, поскольку изображение представляет собой альбомную ориентацию, где я ожидаю, что горизонтальный угол будет больше, чем вертикальный. Я уверен, что это опечатка:
При замене соотношение tan(62 * pi / 360) / tan(48.6 * pi / 360)
- это ожидаемое соотношение сторон 640 / 480
, учитывая размеры изображения и квадратные пиксели.
Во всяком случае, горизонтальный угол t
в основном говорит о том, что горизонтальная протяженность изображения, от левого края до правого края, покрывает дугу t
радиан поля зрения, поэтому пиксель на центр правого края лежит вдоль луча, повернутого на t / 2
радиан вправо от центрального луча обзора. Этот «правый» луч проходит от глаза в начале координат через точку (tan(t / 2), 0, -1)
(предполагается, что правостороннее пространство с положительным x, направленным вправо, и положительным y, направленным вверх, смотря вниз по отрицательной оси z). Чтобы получить точку в пространстве на расстоянии d
от глаза, вы можете просто нормализовать вектор вдоль этого луча и умножить его на d
. Предполагая, что образцы линейно распределены по плоскому датчику, я ожидаю, что для данного пикселя в (x, y)
вы можете рассчитать соответствующую ему точку луча с помощью:
p = (dx * tan(hfov / 2), dy * tan(vfov / 2), -1)
, где dx
- 2 * (x - width / 2) / width
, dy
- 2 * (y - height / 2) / height
, а hfov
и vfov
- углы поля зрения в радианах.
Обратите внимание, что документация , сопровождающая ваши образцы данных, ссылается на файл Matlab , в котором показан рекомендуемый процесс преобразования изображений глубины в поле облака точек и расстояния. В нем поля зрения запекаются с размерами изображения с постоянным коэффициентом 570,3, который можно использовать для восстановления углов поля зрения, которые, по мнению авторов, имели их записывающие устройства:
atan(320 / 570.3) * (360 / pi / 2) * 2 = 58.6
что очень близко к 62 градусам, которые вам дали.
Исходя из кода Matlab, похоже, что значение на изображении - это не расстояние от заданной точки до глаза, а вместо этого расстояние по вектору обзора до перпендикулярной плоскости, содержащей данную точку («глубина» или в основном »). z "), поэтому авторы могут просто умножить его непосредственно на вектор (dx * tan(hfov / 2), dy * tan(vfov / 2), -1)
, чтобы получить точку в пространстве, пропуская этап нормализации, упомянутый ранее.