Создание облака точек из изображения глубины

Я пытаюсь преобразовать изображение глубины (RGBD) в трехмерное облако точек. Решение, которое я сейчас использую, взято из этого сообщения, где:

  • cx = высота центра изображения
  • cy = ширина центра изображения
  • fx и fy = 250, выбираются путем перебора нескольких параметров

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

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


person Lloyd Rayner    schedule 04.01.2020    source источник


Ответы (1)


Вы можете легко решить эту проблему с помощью пакета open3d. Установите его с помощью sudo pip install -U open3d-python (не просто open3d - это другой пакет).

После установки:

from open3d import *

rgbd = create_rgbd_image_from_color_and_depth(color, depth, convert_rgb_to_intensity = False)
pcd = create_point_cloud_from_rgbd_image(rgbd, pinhole_camera_intrinsic)

# flip the orientation, so it looks upright, not upside-down
pcd.transform([[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]])

draw_geometries([pcd])    # visualize the point cloud

В приведенном выше коде предполагается, что у вас есть цветное изображение в color и изображение глубины в depth. Для получения дополнительной информации проверьте образцы, поставляемые с open3d.

Если у вас есть собственная камера, вы можете заменить pinhole_camera_intrinsic ими, но для тестового прогона камера-обскура работает более или менее нормально.

person lenik    schedule 04.01.2020
comment
Спасибо за предложение @Lenik. В результате получается срезанное облако точек (ibb.co/yy4F94b), знаете почему? - person Lloyd Rayner; 04.01.2020
comment
@LloydRayner, если вы найдете мой ответ полезным, вы можете проголосовать за и / или принять его, почему ваше облако точек выглядит разрезанным - я не знаю, вряд ли это проблема пакета open3d - я использую его довольно часто. Возможно, вам может помочь просмотр ваших данных о глубине, особенно что-то вроде графика зависимости количества точек от расстояния - это может показать вам некоторые недостающие области глубины или другие неровности. - person lenik; 05.01.2020
comment
У меня вопрос, как загрузить данные изображения и глубины. В функции create_rgbd_image_from_color_and_depth входными аргументами являются цвет и глубина. Не могли бы вы объяснить, как загрузить изображение? Вы используете OpenCV или PIL Image для этой цели? Я очень признателен, если бы вы могли поделиться всем кодом. - person Mohammad; 29.09.2020
comment
@Mohammad Вы можете загружать изображения из файла с depth = o3d.io.read_image(filename). Вы также можете преобразовать numpy-изображения в o3d, как указано здесь, но для меня это иногда не работает (я не знаю по какой-то причине). - person ketza; 25.01.2021