均匀点云边界检测——密度查找(2/2)

密度与梯度

在上一节已经尝试用点云密度来区分边界,但是点云的边界不仅是有高密度区域还有很多密度不均匀的区域,如车载雷达:

均匀点云边界检测——密度查找(2/2)_第1张图片

这些有的区域密集,有的区域稀疏的点云仅使用密度不大容易区分点云的边界,这种时候需要应用更加细致的语义分割方法来描边。

梯度

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一, 梯度一般表现了某个点向周围点变换的变化率。对于函数中的某个变量微分可以得到此变量相对于函数的梯度。

均匀点云边界检测——密度查找(2/2)_第2张图片

密度梯度

将梯度的概念引入本边界处理方法,我们把某个点的密度与周围一定范围内的点的密度之差称为“密度梯度”。若我们的点云并不均匀,有的地方密集有的地方稀疏

均匀点云边界检测——密度查找(2/2)_第3张图片

混合解:将密度梯度与密度的解法叠加,能够有效的弥补另一种解法的不足,将点云的边界基本描绘出来。

单密度效果:

均匀点云边界检测——密度查找(2/2)_第4张图片

单梯度效果:

均匀点云边界检测——密度查找(2/2)_第5张图片

完整代码

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud(".../crack001_pcd.pcd")

pcd.paint_uniform_color([0.5, 0.5, 0.5])
pcd_tree = o3d.geometry.KDTreeFlann(pcd)


k_recordlist = []
idx1_recordlist = []
for i in range(len(pcd.points)):
    [k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[i], 0.1)#半径搜索
    k_recordlist.append(k1)
    idx1_recordlist.append(idx1)

k_de_recordlist = []
k_idx1_recordlist = []
for i in range(len(pcd.points)):
    k_de_recordlist.clear()
    for id in idx1_recordlist[i]:
        k_de_recordlist.append(k_recordlist[id])
    if max(k_de_recordlist) - k_de_recordlist[0] > 15 or k_recordlist[i] <= 15:
        np.asarray(pcd.colors)[i] = [0, 0, 1]


o3d.visualization.draw_geometries([pcd])

均匀点云边界检测——密度查找(2/2)_第6张图片

 图中可以明显看到点云的边界已经基本检测出来了,如果对密度部分表现不大满意可以对密度阈值的参数进行一定的调整。

你可能感兴趣的:(算法)