Используя изображения RGB и PointCloud, как создать карту глубины из PointClouds? (Python)

Я работаю над слиянием изображений Лидара и Камеры, чтобы выполнить алгоритм классификации объектов с использованием CNN.

Я хочу использовать набор данных KITTI, который предоставляет синхронизированные данные изображения лидаров и RGB. Лидаром являются 3D-сканеры, поэтому на выходе получается 3D Point Cloud.

Я хочу использовать информацию о глубине из облака точек в качестве канала для CNN. Но я никогда не работал с облаком точек, поэтому прошу помощи. Проецирует ли облако точек на плоскость изображения камеры (используя проекционную матрицу, предоставленную Китти), даст мне нужную карту глубины? Python libray pcl полезен или мне следует перейти на библиотеки C++?

Если у вас есть предложения, заранее спасибо

3 ответа

Решение

Я не уверен, что включает в себя матрица проекций, предоставляемая Китти, поэтому ответ зависит. Если эта матрица проекции содержит только матрицу преобразования, вы не можете сгенерировать карту глубины из нее. 2D-изображение имеет искажения, которые исходят от 2D-камеры, а облако точек обычно не имеет искажений, поэтому вы не можете "точно" отобразить облако точек на rgb-изображение без внутренних и внешних параметров.

PCL не требуется для этого.

Карта глубины, по сути, отображает значение глубины в изображение RGB. Вы можете рассматривать каждое облако точек (каждый лазер лидера) как пиксель изображения RGB. Поэтому, я думаю, все, что вам нужно сделать, - это найти, какое облако точек в точке соответствует первому пикселю (верхнему левому углу) изображения RGB. Затем прочитайте значение глубины из облака точек на основе разрешения изображения RGB.

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

https://github.com/soulslicer/kitti_depthmap

Вы не имеете никакого отношения к камере. Все дело в данных облака точек. Допустим, у вас есть 10 миллионов точек, и каждая точка имеет x,y,z в метрах. Если данные не в метрах, сначала преобразуйте их. Затем вам нужно положение лидара. Когда вы вычитаете положение автомобиля из всех точек одну за другой, вы примете положение лидара к точке (0,0,0), после чего вы можете просто распечатать точку на белом изображении. Остальное - простая математика, может быть много способов сделать это. Первое, что приходит мне в голову: воспринимайте rgb как двоичные числа. Допустим, 1 см масштабируется для изменения в 1 синем, изменение в 256 см соответствует изменению в 1 зеленом и 256x256, что составляет 65536 см, изменение равняется изменению в 1 красном. Мы знаем, что cam равен (0,0,0), если rgb точки составляет 1,0,0, то это означает 256x256x1+0x256+0x1=65536 см от камеры. Это можно было сделать на C++.Также вы можете использовать алгоритмы интерполяции и ближайшей точки для заполнения пробелов, если есть

Другие вопросы по тегам