将numpy数组传入open3d.utility.Vector3dVector时出现段错误求助
解决numpy 2.0.0下Open3D Vector3dVector段错误问题
针对numpy 2.0.0与Open3D的ABI不兼容导致的段错误,以下是无需全局更换numpy版本的可行方案:
强制内存连续化转换
numpy 2.0.0的数组内存布局可能与Open3D预期的C连续格式不符,显式转换后再传入:import numpy as np import open3d as o3d # 原始float64数组 points_np = np.random.rand(500, 3).astype(np.float64) # 转换为C连续内存布局的数组 points_c_contig = np.ascontiguousarray(points_np) # 生成Vector3dVector vec = o3d.utility.Vector3dVector(points_c_contig)手动构造Vector3dVector
规避直接的numpy数组绑定,逐个添加点元素:import numpy as np import open3d as o3d points_np = np.random.rand(500, 3).astype(np.float64) vec = o3d.utility.Vector3dVector() for point in points_np: vec.append(point)虚拟环境隔离兼容版本
不影响全局环境的前提下,用虚拟环境单独配置兼容的numpy(1.26.x系列)与Open3D:# 创建虚拟环境 python -m venv o3d_compat_env # Windows激活环境 o3d_compat_env\Scripts\activate # Linux/macOS激活环境 source o3d_compat_env/bin/activate # 安装兼容依赖 pip install numpy==1.26.4 open3d # 处理完点云任务后退出环境 deactivate直接赋值给PointCloud属性
跳过单独生成Vector3dVector的步骤,直接将处理后的数组赋值给点云对象:import numpy as np import open3d as o3d points_np = np.random.rand(500, 3).astype(np.float64) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(np.ascontiguousarray(points_np))
内容的提问来源于stack exchange,提问作者resautu
相关产品推荐
相关产品推荐

