You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从深度图与边界框创建OrientedBoundingBox并裁剪点云

基于矩形掩码和深度图裁剪点云的实现方案

要将矩形的(x,y)像素范围和深度图的z值范围传入OrientedBoundingBox,核心是把像素坐标的矩形范围转换到点云的3D坐标范围,再结合深度图的z值区间构建包围盒。以下是具体实现步骤:

关键逻辑说明

  • 点云坐标是3D世界坐标,而矩形掩码是2D像素坐标,需要建立二者的映射关系(比如通过相机内参转换,或点云本身保留的像素关联信息)来获取对应3D点的x、y范围。
  • 深度图的z值范围可直接从掩码区域内的深度数据提取最小、最大值。

完整代码实现

import open3d as o3d
import numpy as np

# 加载示例点云
demo_icp_pcds = o3d.data.DemoICPPointClouds()
pcd = o3d.io.read_point_cloud(demo_icp_pcds.paths[0])
points = np.asarray(pcd.points)

# 替换为你的真实掩码、深度图和矩形范围
depth_mask = np.ones((480, 640), dtype=np.uint8)  # 深度图常规尺寸为HxW
rect = [(20, 50), (70, 75)]  # [(xmin_pix, xmax_pix), (ymin_pix, ymax_pix)]
depth_map = np.random.rand(480, 640) * 5  # 模拟深度值,范围0-5米

# 1. 提取掩码区域内的深度值范围
x_min_pix, x_max_pix = rect[0]
y_min_pix, y_max_pix = rect[1]
masked_depth = depth_map[y_min_pix:y_max_pix, x_min_pix:x_max_pix]
z_min = np.min(masked_depth)
z_max = np.max(masked_depth)

# 2. 获取像素矩形对应的3D点云x、y范围
# 实际场景中需替换为真实的像素-3D点映射逻辑(比如通过相机内参转换)
# 这里简化为:假设点云前两维度与像素坐标存在对应关系,筛选出对应点后取极值
filtered_points = points[
    (points[:, 0] >= x_min_pix) & (points[:, 0] <= x_max_pix) &
    (points[:, 1] >= y_min_pix) & (points[:, 1] <= y_max_pix)
]
if len(filtered_points) == 0:
    print("没有符合条件的点")
    exit()

x_min_3d = np.min(filtered_points[:, 0])
x_max_3d = np.max(filtered_points[:, 0])
y_min_3d = np.min(filtered_points[:, 1])
y_max_3d = np.max(filtered_points[:, 1])

# 3. 构建OrientedBoundingBox
center = [
    (x_min_3d + x_max_3d) / 2,
    (y_min_3d + y_max_3d) / 2,
    (z_min + z_max) / 2
]
extent = [
    x_max_3d - x_min_3d,
    y_max_3d - y_min_3d,
    z_max - z_min
]
# 无需旋转,使用单位旋转矩阵
R = np.eye(3)

o_box = o3d.geometry.OrientedBoundingBox(center=center, R=R, extent=extent)

# 执行裁剪
cropped_pcd = pcd.crop(o_box)

# 可视化验证(可选)
o3d.visualization.draw_geometries([pcd, o_box, cropped_pcd])

注意事项

  • 若点云由RGB-D相机生成,需用相机内参将像素坐标转为3D世界坐标,转换公式:
    x = (u - cx) * z / fx
    y = (v - cy) * z / fy
    
    其中(u,v)为像素坐标,(cx, cy)为相机主点,fx、fy为焦距,z为深度值。
  • 需提前处理掩码区域无有效深度值的情况(比如全为0),避免包围盒参数无效。

内容的提问来源于stack exchange,提问作者bhomaidan90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:35:40