AABB-轴对齐包围框-原理-代码实现

前言

  • 我们先简单了解些轴对齐包围框(AABB)方法
    • 定义:轴对齐包围框是沿着坐标轴方向的长方体,包围点云的所有点。
    • 优点:计算简单,只需要找到点云的最小和最大坐标值,然后构建长方体。
    • 缺点:对于倾斜或旋转的物体,AABB往往不能紧密包围,容易出现较多的空白区域。

后面我将从算法原理中讲解,使用np实现AABB方法。后面我在实际中使用豆荚为例子,使用open3d库来使用AABB方法,因为open3d内置封装好AABB方法可以直接使用。
Pasted image 20240920092445

算法原理实现

  • 给定一组3D点(通常是一个物体的顶点集)。
  • 计算这些点在 X、Y、Z 方向上的最小值和最大值。
  • 使用这些最小值和最大值构建 AABB。

代码实现

import numpy as np

# 定义3D点集合,假设这是一个物体的顶点坐标
points = np.array([
    [1.0, 2.0, 3.0],
    [2.0, 3.0, 5.0],
    [-1.0, -2.0, 0.5],
    [3.0, 5.0, 7.0],
    [0.0, 1.0, -1.0]
])

# 计算AABB
def compute_AABB(points):
    """
    计算给定3D点集的轴对齐包围盒(AABB)
    
    参数:
    points: 3D点的数组,形状为 (n, 3),每行代表一个3D点
    
    返回:
    min_point: AABB的最小坐标点(X_min, Y_min, Z_min)
    max_point: AABB的最大坐标点(X_max, Y_max, Z_max)
    """
    min_point = np.min(points, axis=0)  # 计算每个维度的最小值
    max_point = np.max(points, axis=0)  # 计算每个维度的最大值
    return min_point, max_point

# 调用函数计算AABB
min_point, max_point = compute_AABB(points)

# 输出结果
print("AABB最小点: ", min_point)
print("AABB最大点: ", max_point)

运行结果

AABB最小点:  [-1.  -2.  -1. ]
AABB最大点:  [3. 5. 7.]

利用open3D实现

导入点云

Pasted image 20240920092521

file_path = './data/5.txt' #这里使用的是xyzrgb格式的点云数据

point_cloud_data = np.loadtxt(file_path)

points = point_cloud_data[:, :3]
colors = point_cloud_data[:, 3:] / 255.0  
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
pcd.colors = o3d.utility.Vector3dVector(colors)

计算 AABB

aabb = pcd.get_axis_aligned_bounding_box()

可视化 AABB

  • 计算出的 AABB 会以一个红色的长方体显示在原始点云的周围,包裹住所有点。
  • 控制台会输出 AABB 的最小点和最大点坐标。

Pasted image 20240920092445

aabb.color = (1, 0, 0)  # 将AABB设置为红色
o3d.visualization.draw_geometries([pcd, aabb])

整体代码

import open3d as o3d
import numpy as np

# 创建一个简单的点云
points = np.array([
    [1.0, 2.0, 3.0],
    [2.0, 3.0, 5.0],
    [-1.0, -2.0, 0.5],
    [3.0, 5.0, 7.0],
    [0.0, 1.0, -1.0]
])

# 将点云转换为 Open3D 的 PointCloud 对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)

# 计算AABB(轴对齐包围盒)
aabb = pcd.get_axis_aligned_bounding_box()

# 打印AABB的信息
print("AABB最小点:", aabb.min_bound)
print("AABB最大点:", aabb.max_bound)

# 可视化点云和AABB
aabb.color = (1, 0, 0)  # 将AABB设置为红色
o3d.visualization.draw_geometries([pcd, aabb])

猜你喜欢

转载自blog.csdn.net/u012901740/article/details/142375692