首页 > 其他分享 >轴对齐包围框-AABB-原理-代码实现

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

时间:2024-09-20 10:55:16浏览次数:10  
标签:min max AABB point points 对齐 代码 pcd

前言

  • 我们先简单了解些轴对齐包围框(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])

标签:min,max,AABB,point,points,对齐,代码,pcd
From: https://blog.csdn.net/u012901740/article/details/142375692

相关文章

  • 代码随想录 -- 二叉树 -- 把二叉搜索树转换为累加树
    538.把二叉搜索树转换为累加树-力扣(LeetCode)思路:定义pre变量用来记录当前节点的前一个节点(右中左顺序遍历)的值。递归出口:当root为空时,return。单层递归逻辑:(右中左)右:self.tra(root.right)中:令root的值为它本身加上pre,更新pre为当前root的值;左:self.tra(root.left)class......
  • 代码随想录 -- 二叉树 -- 将有序数组转换为二叉搜索树
    108.将有序数组转换为二叉搜索树-力扣(LeetCode)思路:(注意题目要求是平衡二叉树!!!)递归出口:当传入数组为空时,返回空。单层递归逻辑:找到数组中间的值,令其为root,数组左边为root的左子树,数组右边为root的右子树。最后返回root。classSolution(object):defsortedArrayTo......
  • 代码随想录 -- 二叉树 -- 修剪二叉搜索树
     669.修剪二叉搜索树-力扣(LeetCode)思路:递归出口:当root为空时,返回空。当root的值比low小时,如果root没有右子树,直接返回空;否则返回trimBST(root.right,low,high)。当root的值比high大时,如果root没有左子树,直接返回空;否则返回trimBST(root.left,low,high)。单层递归逻辑:......
  • 【集成学习|Bagging、Boosting 和 Stacking】三种常见的集成学习算法的联系与区别?以及
    【集成学习|Bagging、Boosting和Stacking】三种常见的集成学习算法的联系与区别?以及如何实现?【集成学习|Bagging、Boosting和Stacking】三种常见的集成学习算法的联系与区别?以及如何实现?附代码学习文章目录【集成学习|Bagging、Boosting和Stacking】三种常见的......
  • 2024年华为杯数学建模研赛 最全赛中助攻思路+代码+成品论文
    2024年华为杯研究生数学建模竞赛(以下简研赛)将于9月21日上午8时正式开始。下文包含:2024研赛思路解析​、研赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大......
  • 深入解析Vue 3组合函数:提高代码复用性和模块化的最佳实践
    随着Vue3的引入,组合式API(CompositionAPI)带来了更灵活的代码组织方式,组合函数作为其核心部分,能够显著提升代码的可维护性、复用性和模块化。在这篇文章中,我们将通过一个具体的表格管理和分页功能的示例,详细介绍如何使用组合函数来构建更加高效和清晰的Vue3应用。1.组合函数......
  • 沉浸式利用自然语言无代码开发工具生成式AI产品应用(上)
    背景 小伙伴们过去在开发应用时,经常需要编写大量代码文件以实现业务逻辑,想必肯定有小伙伴开发过类似于快消行业索赔处理、订单库存跟踪和项目审批等系统。去解决这些业务实际问题,我们需要定制地开发业务应用程序为这些问题提供解决方案。然而,开发这些应用通常需要庞大的专业......
  • C++代码编译过程
    代码转换成可执行文件的全过程看了一些网上的文章,觉的还是自己写写看看才能理解通透,也为找简历做准备。代码转换成可执行文件分为4个步骤,预处理、编译、汇编、链接。预处理这个过程是执行代码中的一些预处理指令,多说无益,直接上代码#include<iostream>#defineBesttrue;#i......
  • 计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分
    ......
  • Monorepo:一仓统天下,揭秘现代开发的高效代码管理模式
    一句话文学:说清楚2个问题:1.什么是monorepo.2.monorepo都有哪几种代码结构模式很久以前,在一个名叫代码王国的地方,程序员们都在自己的小屋里忙着写代码。他们各自拥有自己的工具箱(代码库),但每次要分享工具或者联合工作时,就得穿过迷宫般的文件夹,传递代码包裹,甚至为了保证......