Region growing
- 计算每个点的曲率,然后根据曲率大小排序,成为列表A。
- 清空seeds_c, region_c。从A取出曲率最小的那一个,同时放进seeds_c和region_c中,同时从A中去除这一个元素。
- 遍历seeds_c中的元素,寻找里面每一个点(本位点)的邻域点。遍历邻域点,如果A中包含了某个邻域点,并且这个邻域点和本位点的法向量角度偏差小于阈值,则把这个邻域点放进region_c中。从A中去除这个元素。如果这个邻域点的曲率小于阈值,则把这个邻域点放进seeds_c中。
- 将region_c放进region中
- 如果A非空,则从第2步开始重复
「注:_c后缀表示“当前的”。“放进“表示集合取并。第3步中改变的seeds_c仅对遍历邻域点有效,随后被清空。」
参考文献
补充:点云法向量的提取
提取点云中法向量,可以1)先从点云数据中拟合曲面,再计算曲面上的法向量。2)直接从点云数据中计算近似的法向量。
我们使用的是后者。
我们把曲面的法向量问题近似为平面的法向量问题,则可以用主成分分析法PCA拟合平面。将一个点及其邻域点写成矩阵,并将每一维归一化为零均值(减去各维的平均值),然后计算协方差矩阵的特征值和特征向量。「由于均值为0,则协方差矩阵=零均值矩阵・零均值矩阵转置/矩阵中元素数目。」最大特征值对应的特征向量就是平面法向量。
上述算法存在的问题在于,计算出的法向量,有可能向里,也有可能向外,是不统一不连续的。因此还需要再增加一个判别:. 其中是观察点,是点云中的点,是处的法向量。(相当于指定所有法向量都向外)
算法中邻域大小由需要分辨的细节的大小来决定。需要分辨的特征越大,则邻域可以取得越大;反之越小。
在PCL中可以使用现成的函数:
参考文献