Python中如何将numpy数组转换为Open3D Image格式?
OpenCV numpy数组转Open3D Image实现方案
内置转换支持说明
Open3D原生提供了直接从numpy数组构造Image对象的能力,无需自行实现内存拷贝或格式适配逻辑,你可以直接调用o3d.geometry.Image()传入符合要求的numpy数组完成转换。
转换步骤及注意事项
- OpenCV输出的numpy数组默认通道顺序为BGR,和Open3D默认使用的RGB通道顺序不一致,三通道彩色图像转换前需要先做通道调换:
cv2.cvtColor(cv_numpy_array, cv2.COLOR_BGR2RGB) - 如果传入的numpy数组经过切片、转置等操作导致内存不连续,需要先调用
np.ascontiguousarray()或.copy()生成连续内存数组,否则构造时会抛出异常 - 单通道灰度图、深度图不需要做通道转换,符合内存连续要求的前提下可直接传入构造函数
完整代码示例
import cv2 import numpy as np import open3d as o3d from cv_bridge import CvBridge # ROS监听器中获取图像msg后的转换逻辑 bridge = CvBridge() # 此处的img_msg为image_transport订阅回调中拿到的ROS图像消息 cv_numpy_img = bridge.imgmsg_to_cv2(img_msg, desired_encoding="passthrough") # 分类型转换 if len(cv_numpy_img.shape) == 3 and cv_numpy_img.shape[-1] == 3: # 彩色BGR转RGB rgb_numpy_img = cv2.cvtColor(cv_numpy_img, cv2.COLOR_BGR2RGB) o3d_img = o3d.geometry.Image(rgb_numpy_img) else: # 灰度图/深度图直接转换 o3d_img = o3d.geometry.Image(np.ascontiguousarray(cv_numpy_img))
结果验证
你可以通过以下方式验证转换是否正确:
- 打印对象信息:
print(o3d_img),输出的宽、高、通道数、位深需和原numpy数组参数一致 - 可视化查看:
o3d.visualization.draw_geometries([o3d_img]),可直接查看图像内容是否正常
内容的提问来源于stack exchange,提问作者zjnyly
相关产品推荐
相关产品推荐

