从一组点开始的C ++平面插值

时间:2017-07-24 15:16:55

标签: c++ 3d interpolation point-cloud-library plane

我使用PCL,点云,库进行C ++编程。

我的问题是:计算某些点的方差,但仅相对于垂直轴相对于平面。我会自己解释一下:

所以我正在做的是通过表面平滑度(使用region growing segmentation)将点云划分为多个段。对于每个段我想测量表面的准确度,我最好的方法是计算最适合表面点的平面,然后基本上计算点相对于平面的方差(从点到飞机的距离等)。 所以我知道在3D中存在二次或样条插值,但我并不擅长它,我认为应该有一个已经执行它的库。然而,我发现的大部分都没有计算/返回平面方程,所以我不太确定如何去做。

欢迎任何帮助,欢呼。

1 个答案:

答案 0 :(得分:0)

你需要基础向量...所以让N成为你的平面法线。要插入您的平面,您需要在平面内有2个基础向量U,V,并且在该平面上需要一个起点P0 ...

假设我们知道N,P0,因此可以通过利用跨产品来计算U,V

// U is any vector non parallel to N
U = (1.0,0.0,0.0)
if (|dot(U,N)|>0.75) U = (0.0,1.0,0.0)
// make U,V perpendicular to N and each other
V = cross(N,U)
U = cross(V,N)
// normalize U,V,N
U = U/|U|
V = V/|V|
N = N/|N|

现在平面上的任何点都可以这样插值:

P(u,v) = P0 + u*U + v*V

其中u,v是您的插值标量参数,它也等于P(u,v)UV P0方向的垂直距离。

要评估您的点与飞机的距离(海拔高度),您只需执行此操作

alt = dot(N,P(u,v)-P0)

所以不需要二次方符号...同样,如果您需要某个点u,v的{​​{1}},您可以这样做:

P