def get_minimal_oriented_bounding_box(
*,
save_vertices_to_file="",
**kwargs
) -> Tuple[open3d.geometry.OrientedBoundingBox, np.ndarray]:
pass
计算最小定向包围盒(OBB)。
save_vertices_to_file
(str, optional): 可选参数,一个可写的文件路径,保存OBB的顶点的xyz坐标。默认为""。除了上述参数外,该函数还接受以下其它参数:
radius
: 确定点云的边界球的半径。具体来说,该半径内的所有点都被考虑在内。当使用体素网格时需要该参数。半径的值应大于点云中点之间的最大距离。
sample
: 对点云进行下采样的因子,即每个采样体素的边长。通过将点云下采样到较小的密度来加速计算。
fast
: 是否使用快速方法。快速方法迭代次数较少,但通常能够获得足够准确的结果。如果需要更高精度的结果,请将其设置为False。
return_pcd
: 是否同时返回采样后的点云。开启该项会使函数返回一个二元组,其中第二个元素是采样后的点云。
use_convex_hull
: 是否先计算点云的凸包。当点云具有强凸包结构时,可以加速计算。
growing_duration
: 迭代方法的最长时间(秒)。对于大型点云,设置一个合适的时间可以使结果更好。
growing_speed
: 迭代方法的速度因子。值越高,速度越快。
max_num_points
: 当原始点云的数量超过该指定数量时,使用减小采样密度的方法来简化计算。对于大型点云,建议将该参数设置为一个较小值,否则可能会导致内存溢出或计算时间过长。
counter
: 该参数不应手动指定,在点云下采样过程中自己更新。
返回一个二元组 (obb, pcd)
, pcd
是采样点云,obb
是最小定向包围盒。
若禁用了 return_pcd
,则仅返回一个 obb
。
import open3d as o3d
pcd = o3d.io.read_point_cloud("cloud.ply")
# 求解OBB
obb = pcd.get_minimal_oriented_bounding_box()
# 保存采样后的点云和OBB的顶点的xyz坐标
obb, sampled_pcd = pcd.get_minimal_oriented_bounding_box(save_vertices_to_file="./obb.xyz", return_pcd=True)
# 读取保存的OBB的顶点的xyz坐标
import numpy as np
obb_vertices = np.loadtxt("./obb.xyz")
NotImplementedError
: 当点云为空时抛出。open3d.geometry.OrientedBoundingBox
: 表示最小定向包围盒的类。该函数使用了下采样和不同的回国方法。先计算点云的凸包,再生成多个正交轴方向的候选轴。从其中一个轴开始,计算轴方向上的点云范围。利用新点在坐标系中的距离计算一个范围并移动坐标系。一旦找到一个比之前更好的轴,以其方向为新的轴开始计算,直到所有轴都被枚举。最终OBB的姿势和范围存储在 OrientedBoundingBox 对象中返回。