Как создать облако точек из изображений RGB и глубины? - PullRequest
1 голос
/ 08 мая 2019

Для университетского проекта, над которым я сейчас работаю, я должен создать облако точек, считывая изображения из этого набора данных. В основном это видеокадры, и для каждого кадра есть изображение rgb вместе с соответствующим изображением глубины.

Я знаком с уравнением z = f*b/d, однако не могу понять, как следует интерпретировать данные. Информация о камере, которая использовалась для съемки видео, не предоставляется, а также проект гласит следующее:

"Рассмотрим горизонтальное / вертикальное поле зрения камеры 48,6 / 62 градусы соответственно "

У меня практически нет опыта в компьютерном зрении, и я никогда не сталкивался с двумя полями зрения, которые использовались ранее. Предполагая, что я использую глубину изображения как есть (для координаты z), как бы я рассчитал координаты x и y каждой точки в облаке точек?

Вот пример того, как выглядит набор данных:

rgb image corresponding depth image

1 Ответ

2 голосов
/ 08 мая 2019

Да, необычно указывать несколько полей обзора. Для типичной камеры (квадратные пиксели, минимальное искажение, вектор обзора через центр изображения) обычно дается только один угол поля зрения - горизонтальный или вертикальный, поскольку другой может быть получен из соотношения сторон изображения.

Особенно удивительно указывать горизонтальный угол 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), чтобы получить точку в пространстве, пропуская этап нормализации, упомянутый ранее.

...