Open3D显示点云的外包围框

目录

一、Open3D中的aabb和obb包围盒的区别

1.1 AABB

主要函数

 获取AABB包围盒的属性

1.2 OBB

主要函数

获取OBB包围盒的属性

二、代码实现

2.1 AABB代码

2.2 OBB代码

三、包围盒结果显示

3.1 AABB包围盒显示

3.2 OBB包围盒显示


 Open3D点云算法汇总及实战案例汇总的目录地址:

Open3D点云算法与点云深度学习案例汇总(长期更新)-优快云博客


一、Open3D中的aabb和obb包围盒的区别

        包围盒是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行,碰撞检测Q或者进行精确的碰撞检测之前进行过滤。

1.1 AABB

主要函数

取坐标最大值和最小值计算简单,但空间有余不能较好的表达物体的真实位姿;

1、get_axis_aligned_bounding_box()获取aabb包围盒。
2、aabb.color = (1,0,0)给aabb包围盒着色。
3、get_center()返回几何坐标的中心。

 获取AABB包围盒的属性

4、get_extent()获取边界框在x、y和z维度的范围/长度。
5、get_geometry_type()返回已注册的几何类型之一。
6、get_half_extent()返回边框的一半范围。
7、get_max_bound()返回几何坐标的最大边界。
8、get_min_bound()返回几何坐标的最小边界。
9、get_box_points()返回定义边界框的8个点。

1.2 OBB

主要函数

OBB包围盒:先进行PCA,取得投影方差最大的方向作为坐标轴方向计算较复杂,但空间不存在余,也最常用;

1、get_oriented_bounding_box()获取obb包围盒。
2、obb.color = (0,1,0)给obb包围盒着色。
3、get_center()返回几何坐标的中心。

获取OBB包围盒的属性

4、get_max_bound()返回几何坐标的最大边界。
5、get_min_bound()返回几何坐标的最小边界。
6、get_box_points()返回定义边界框的8个点。
7、get_point_indices_within_bounding_box(self, points)将索引返回到边界框内的点。

二、代码实现

2.1 AABB代码

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("ear_phones.pcd")
print(pcd)  # 输出点云点的个数
aabb = pcd.get_axis_aligned_bounding_box()
aabb.color = (1, 0, 0)  # aabb包围盒为红色

[center_x, center_y, center_z] = aabb.get_center()
print("aabb包围盒的中心坐标为:\n", [center_x, center_y, center_z])

vertex_set = np.asarray(aabb.get_box_points())
print("obb包围盒的顶点为:\n", vertex_set)

aabb_box_length = np.asarray(aabb.get_extent())
print("aabb包围盒的边长为:\n", aabb_box_length)

half_extent = np.asarray(aabb.get_half_extent())
print("aabb包围盒边长的一半为:\n", half_extent)

max_bound = np.asarray(aabb.get_max_bound())
print("aabb包围盒边长的最大值为:\n", max_bound)

max_extent = np.asarray(aabb.get_max_extent())
print("aabb包围盒边长的最大范围,即X, Y和Z轴的最大值:\n", max_extent)

min_bound = np.asarray(aabb.get_min_bound())
print("aabb包围盒边长的最小值为:\n", min_bound)

o3d.visualization.draw_geometries([pcd, aabb], window_name="AABB包围盒",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

2.2 OBB代码

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("bunny.pcd")
print(pcd)  # 输出点云点的个数
obb = pcd.get_oriented_bounding_box()
obb.color = (0, 1, 0)  # obb包围盒为绿色

[center_x, center_y, center_z] = obb.get_center()
print("obb包围盒的中心坐标为:\n", [center_x, center_y, center_z])

vertex_set = np.asarray(obb.get_box_points())
print("obb包围盒的顶点为:\n", vertex_set)

max_bound = np.asarray(obb.get_max_bound())
print("obb包围盒边长的最大值为:\n", max_bound)

min_bound = np.asarray(obb.get_min_bound())
print("obb包围盒边长的最小值为:\n", min_bound)

o3d.visualization.draw_geometries([pcd, obb], window_name="OBB包围盒",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

三、包围盒结果显示

3.1 AABB包围盒显示

aabb包围盒的中心坐标为:
 [95.56000137329102, 40.19999837875366, -14.536499977111816]
obb包围盒的顶点为:
 [[ 73.36000061  12.56000042 -22.6079998 ]
 [117.76000214  12.56000042 -22.6079998 ]
 [ 73.36000061  67.83999634 -22.6079998 ]
 [ 73.36000061  12.56000042  -6.46500015]
 [117.76000214  67.83999634  -6.46500015]
 [ 73.36000061  67.83999634  -6.46500015]
 [117.76000214  12.56000042  -6.46500015]
 [117.76000214  67.83999634 -22.6079998 ]]
aabb包围盒的边长为:
 [44.40000153 55.27999592 16.14299965]
aabb包围盒边长的一半为:
 [22.20000076 27.63999796  8.07149982]
aabb包围盒边长的最大值为:
 [117.76000214  67.83999634  -6.46500015]
aabb包围盒边长的最大范围,即X, Y和Z轴的最大值:
 55.279995918273926
aabb包围盒边长的最小值为:
 [ 73.36000061  12.56000042 -22.6079998 ]

3.2 OBB包围盒显示

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud('ear_phones.pcd')
print(pcd)  # 输出点云点的个数
obb = pcd.get_oriented_bounding_box()
obb.color = (0, 1, 0)  # obb包围盒为绿色

[center_x, center_y, center_z] = obb.get_center()
print("obb包围盒的中心坐标为:\n", [center_x, center_y, center_z])

vertex_set = np.asarray(obb.get_box_points())
print("obb包围盒的顶点为:\n", vertex_set)

max_bound = np.asarray(obb.get_max_bound())
print("obb包围盒边长的最大值为:\n", max_bound)

min_bound = np.asarray(obb.get_min_bound())
print("obb包围盒边长的最小值为:\n", min_bound)

o3d.visualization.draw_geometries([pcd, obb], window_name="OBB包围盒",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值