FPS
没有想到不按套路出牌的美团今早就撕了这个。
点云最远点采样,从一堆点集中选出一些点,使得他们尽可能地远离。这样采样出来的点能比较好的表征整个轮廓。在pointnet++中就用到过。
整体思路是:分别维护一个已选取和待选取的点云集合。先从点云集合中选出一个点,然后计算其余所有点到该点的距离,距离最大的那个点是下次要加入的点。当pick集合中有多个点时,距离的定义为到集合每个点距离中的最小距离。
关于距离的计算:维护一个distance列表,对于每次pick出来的点,去更新distance。可以利用前缀性质,不需要重新计算点到集合中所有点的距离了,而是选取原值和到新point的距离中的较小值,即dis = min(dis, newdis)。
关于第一个点的选取:一般用离点云重心最远的点作为初始点
import numpy as np
import matplotlib.pyplot as plt
# def compute_dis(points):
# ## points: N*3
# ## return -- distances: N*N
# points_dis = np.sum(np.power(points, 2), axis=1) # N
# distances = np.expand_dims(points_dis, axis=1).repeat(points.shape[0], axis=1) # N*N
# distances = distances + distances.T + 2 * np.dot(points, points.T)
# return distances
def plot(points, sample_points):
ax = plt.axes(projection='3d')
ax.scatter3D(points[:,0

本文介绍了点云处理中的一种重要采样方法——最远点采样(FPS)。通过逐步选择距离现有样本最远的点,确保采样点均匀分布在整个点云上。文章详细解释了FPS算法的具体步骤,并提供了Python实现示例。
最低0.47元/天 解锁文章





