#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