open3d 裁剪点云

该文介绍了如何利用Open3D库对点云数据进行裁剪。首先,通过SelectionPolygonVolume裁剪点云,然后使用AxisAlignedBoundingBox进行沿轴向的裁剪。最后,展示了如何裁剪TriangleMesh,通过选择部分三角形来修改mesh的triangles和triangle_normals成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. crop_point_cloud

2. crop

3. crop_mesh


1. crop_point_cloud

关键函数

chair = vol.crop_point_cloud(pcd)   # vol: SelectionPolygonVolume
import open3d as o3d

if __name__ == "__main__":
    # 1. read pcd
    print("Load a ply point cloud, crop it, and render it")
    sample_ply_data = o3d.data.DemoCropPointCloud()
    pcd = o3d.io.read_point_cloud(sample_ply_data.point_cloud_path)

    # 2. crop
    # vol: SelectionPolygonVolume, 定义裁剪区域
    vol = o3d.visualization.read_selection_polygon_volume(sample_ply_data.cropped_json_path) 
    chair = vol.crop_point_cloud(pcd)

    # 2. view
    # Flip the pointclouds, otherwise they will be upside down.
    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    chair.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])

    print("Displaying original pointcloud ...")
    o3d.visualization.draw([pcd])
    print("Displaying cropped pointcloud")
    o3d.visualization.draw([chair])

2. crop

pcd_cropped = pcd.crop(bbox)  # pcd: PointCloud. bbox: AxisAlignedBoundingBox

AxisAlignedBoundingBox https://blog.youkuaiyun.com/jizhidexiaoming/article/details/130561514?spm=1001.2014.3001.5501

# 1. read pcd
print("Load a ply point cloud, crop it, and render it")
sample_ply_data = o3d.data.DemoCropPointCloud()
pcd = o3d.io.read_point_cloud(sample_ply_data.point_cloud_path)

# 2. 定义裁剪区域。沿着y轴过滤: 只返回y坐标在[0.1,2]之间的点
bounds_list = [[-math.inf, math.inf], [0.8, 2], [-math.inf, math.inf]]  # xyz边界范围
# list2tuple, limit points边界点。itertools.product排列笛卡尔乘积是x,y,z各取一个值,组成xyz点坐标
bbox_pt_list = list(itertools.product(*bounds_list))
bbox_pt_vec = o3d.utility.Vector3dVector(bbox_pt_list)  # list
bbox = o3d.geometry.AxisAlignedBoundingBox.create_from_points(bbox_pt_vec)

# 3. crop
pcd_cropped = pcd.crop(bbox)

# 4. display
# Flip the pointclouds, otherwise they will be upside down.
pcd_cropped.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw(pcd_cropped)

3. crop_mesh

上面是裁剪PointCloud,这里裁剪TriangleMesh.

转成numpy,修改mesh的traingles和triangle_normals成员。

import open3d as o3d
import numpy as np
import copy

if __name__ == "__main__":
    # 1. read mesh
    knot_mesh = o3d.data.KnotMesh()
    mesh = o3d.io.read_triangle_mesh(knot_mesh.path)
    mesh.compute_vertex_normals()
    print("Displaying original mesh ...")
    o3d.visualization.draw([mesh])

    # 2. crop: triangles and triangle_normals
    print("Displaying mesh of only the first half triangles ...")
    mesh_cropped = copy.deepcopy(mesh)  # mesh_cropped.triangles. (num, 3)
    mesh_cropped.triangles = o3d.utility.Vector3iVector(  # triangles
        np.asarray(mesh_cropped.triangles)[:len(mesh_cropped.triangles) // 2, :])
    mesh_cropped.triangle_normals = o3d.utility.Vector3dVector(  # triangle_normals
        np.asarray(mesh_cropped.triangle_normals)
        [:len(mesh_cropped.triangle_normals) // 2, :])
    print(mesh_cropped.triangles)
    o3d.visualization.draw([mesh_cropped])

 

 

### Open3D 裁剪点云读取失败解决方案 在使用Open3D进行点云裁剪时遇到读取失败的问题,通常可能由多种原因引起。以下是几种常见的排查方法和解决方案: #### 1. 文件路径验证 确保指定的文件路径正确无误,并且具有足够的权限访问该文件。错误的路径设置可能导致无法加载点云数据。 ```python import open3d as o3d # 正确的文件路径示例 pcd = o3d.io.read_point_cloud("/path/to/your/file.ply") # 使用绝对路径 print(pcd) # 输出点云对象的信息来确认是否成功加载 ``` 如果文件位于相对路径下,则应确保脚本运行环境能够识别此路径[^4]。 #### 2. 数据格式兼容性检查 不同的点云存储格式有不同的结构特点,在尝试打开特定类型的文件前,请先查阅官方文档以确定所使用的版本是否支持这种格式。对于某些特殊格式的数据集,还需要额外安装相应的解析工具包。 #### 3. 库版本一致性校验 不同版本之间可能存在API变化或内部实现差异,因此建议保持依赖项之间的良好匹配度。可以考虑升级到最新稳定版或是回退至已知正常工作的旧版本来进行测试对比。 ```bash pip install --upgrade open3d # 升级open3d到最新版本 ``` #### 4. 错误日志分析 仔细阅读报错信息中的提示文字,往往能从中发现具体问题所在。比如内存不足、硬件加速特性缺失等问题都可能会阻止程序继续执行下去。 #### 5. 示例代码展示 这里给出一段完整的Python代码片段用于演示如何利用Open3D库完成基本的点云裁剪操作: ```python import numpy as np import open3d as o3d def crop_pointcloud(input_file, output_file): pcd = o3d.io.read_point_cloud(input_file) bbox_min = [-10, -10, -10] bbox_max = [10, 10, 10] bounding_box = o3d.geometry.AxisAlignedBoundingBox(min_bound=bbox_min, max_bound=bbox_max) cropped_pcd = pcd.crop(bounding_box) o3d.visualization.draw_geometries([cropped_pcd]) # 可视化结果 o3d.io.write_point_cloud(output_file, cropped_pcd) if __name__ == "__main__": input_path = "/path/to/inputPointCloudFile.ply" output_path = "/desired/outputFilePath.ply" try: crop_pointcloud(input_path, output_path) print(f"Cropped point cloud saved at {output_path}") except Exception as e: print(e) ``` 通过上述措施应该可以帮助定位并修复大多数情况下发生的点云读取异常状况。当然实际开发过程中还会有更多复杂场景需要进一步探讨解决办法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值