我使用PCL,点云,库进行C ++编程。
我的问题是:计算某些点的方差,但仅相对于垂直轴相对于平面。我会自己解释一下:
所以我正在做的是通过表面平滑度(使用region growing segmentation)将点云划分为多个段。对于每个段我想测量表面的准确度,我最好的方法是计算最适合表面点的平面,然后基本上计算点相对于平面的方差(从点到飞机的距离等)。 所以我知道在3D中存在二次或样条插值,但我并不擅长它,我认为应该有一个已经执行它的库。然而,我发现的大部分都没有计算/返回平面方程,所以我不太确定如何去做。
欢迎任何帮助,欢呼。
答案 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)
中U
和V
P0
方向的垂直距离。
要评估您的点与飞机的距离(海拔高度),您只需执行此操作
alt = dot(N,P(u,v)-P0)
所以不需要二次方符号...同样,如果您需要某个点u,v
的{{1}},您可以这样做:
P