как создать изображение rgbd из массива numpy rgb и массива глубины?

#python #arrays #numpy #open3d

#python #массивы #numpy #open3d

Вопрос:

У меня есть массив numpy, который представляет собой цветное изображение «img» формы (высота, ширина, 3), а также массив numpy формы глубины (высота, ширина). И я хочу создать изображение RGBD и отобразить его, для чего я делаю следующее:

 o3d.geometry.RGBDImage.create_from_color_and_depth(img, depth)
  

Но я получаю ошибку:

 TypeError: create_from_color_and_depth(): incompatible function arguments. The following argument types are supported:
    1. (color: open3d.open3d_pybind.geometry.Image, depth: open3d.open3d_pybind.geometry.Image, depth_scale: float = 1000.0, depth_trunc: float = 3.0, convert_rgb_to_intensity: bool = True) -> open3d.open3d_pybind.geometry.RGBDImage

  

Как это исправить? Если для этого требуется тип изображения, то как преобразовать массив numpy в тип изображения?

Даже когда я передаю массивы numpy в o3d.geometry.Конструкторы изображений, подобные этому:

 o3d.geometry.RGBDImage.create_from_color_and_depth(o3d.geometry.Image(img), o3d.geometry.Image(depth))
  

Я получаю сообщение об ошибке:

 TypeError: create_from_color_and_depth(): incompatible function arguments. The following argument types are supported:
    1. (color: open3d.open3d_pybind.geometry.Image, depth: open3d.open3d_pybind.geometry.Image, depth_scale: float = 1000.0, depth_trunc: float = 3.0, convert_rgb_to_intensity: bool = True) -> open3d.open3d_pybind.geometry.RGBDImage

  

Как это исправить и создать изображение RGBD из массива rgb numpy и массива depth numpy?

Комментарии:

1. У меня очень похожая проблема. Вам удалось решить эту проблему и сохранить изображение глубины?

Ответ №1:

Было бы здорово, если бы вы поделились воспроизводимым примером, но я думаю, что создание Image из np.array не так просто, как вызов ctor на основе подписи. Это не обязательно массив uint8, верно?

Основываясь на этой статье, вы должны создать его следующим образом:

 depth_as_img = o3d.geometry.Image((depth).astype(np.uint8))
  

и переходим далее к create_from_color_and_depth . Итак, вы должны явно указать, что это массив uint8.

Комментарии:

1. В моем случае изображение глубины имеет тип np.float32 , который тоже отлично работает. Однако вы также должны убедиться, что это массив c-типа. Это значение по умолчанию, поэтому вам не нужно сильно беспокоиться об этом, но если это не c-type, вы можете использовать o3d.geometry.Image(np.ascontiguousarray(np_array).astype(np.float32)) , чтобы избежать ошибок.

Ответ №2:

Вы должны проверить convert_rgb_to_intensity параметр в этой функции. По умолчанию в нем будет использоваться изображение в оттенках серого. Таким образом, ваше цветное изображение должно иметь только один канал. Если вам нужен RGB, установите для этого параметра значение false и посмотрите, решит ли это проблему.

Кроме того, дополнительные комментарии для numpy к изображению open3d:https://github.com/intel-isl/Open3D/issues/957