目录
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)