最近遇到一个计算点云最小包围盒的应用,查询资料后,发现vtk有现成的API,vtkOBBTree提供了非常方便的便捷的方法 ComputeOBB,其API的描述如下。
/**
* Compute an OBB from the list of points given. Return the corner point
* and the three axes defining the orientation of the OBB. Also return
* a sorted list of relative "sizes" of axes for comparison purposes.
*/
static void ComputeOBB(
vtkPoints* pts, double corner[3], double max[3], double mid[3], double min[3], double size[3]);
| 输入参数 | 说明 |
| pts | 待计算的输入点云数据 |
| 输出参数 | 说明 |
| corner | obb的某一个顶点 |
| max | obb最长边的方向向量 |
| mid | obb次长边的方向向量 |
| min | obb最短边的方向向量 |
| sizes | 按照距离降序排列的方向因子(暂未清楚用处) |
这里要注意 max,mid,min并非是单位向量,而是带各方向的偏移量的向量。因此根据corner的坐标加上各个方向的偏移量即可计算出包围盒的8个顶点。
具体代码实现,获取到包围盒8个顶点的方法仅需要按如下向量计算即可:
class Point3D
{
public:
double x;
double y;
double z;
Point3D operator+(const Point3D& p) const {
return Point3D(x + p.x, y + p.y, z + p.z);
}
};
Point3D corner, max, mid, min, sizes
//假设输入点云是 cloud
vtkOBBTree::ComputeOBB(cloud, &corner.x, &max.x, &mid.x, &min.x, &sizes.x);
Point3D p0 = corner;
Point3D p1 = corner + max;
Point3D p2 = p1 + mid;
Point3D p3 = corner + mid;
Point3D p4 = p3 + min;
Point3D p5 = p4 + max;
Point3D p6 = p1 + min;
Point3D p7 = corner + min;
原始点云效果图

最小包围盒(OBB)效果图


1188

被折叠的 条评论
为什么被折叠?



