FPS算法的逻辑为:
- 以点云第一个点,作为查询点,从剩余点中,取一个距离最远的点;
- 继续以取出来的点,作为查询点,从剩余点中,取距离最远的点。此时,由于已经取出来的点的个数大于1,需要考虑已经选出来的点集中的每个点。计算逻辑如下:
- 对于任意一个剩余点,计算该点到已经选中的点集中所有点的距离;
- 取最小值,作为该点到点集的距离;
- 计算出每个剩余点到点集的距离后,取距离最大的那个点。
- 重复第2步,一直采样到目标数量N为止。
从FPS算法逻辑上看,第1步可以认为是只有一个集合的点,所以可以统一按照第2步点逻辑来实现。在PointNet++源码中,有基于cuda的并行计算实现,实现细节可参考源码:https://github.com/charlesq34/pointnet2/blob/42926632a3c33461aebfbee2d829098b30a23aaa/tf_ops/sampling/tf_sampling_g.cu#L105