基于法向量朝向的点云语义分割

法向量

关于法向量估计的环节我们仍然应用前文的最小生成树估计法。

目前来看最小生成树是有效的估计法向量不可缺少的的步骤。

朝向计算依据

指向分布

法向量指向的分布的计算本文应用向量夹角计算。

但是,我们平时所说相同朝向相同的法向量并不可能是完全相同的方向,这个平面法向量是允许和我们所指示的方向偏离一定的容忍度。

图中如果有两片近似平面的点云,而我们将向量v1作为此分组的朝向。想要将这两块平面点云归为一组,则需要v1与v2向量的夹角小于一定的阈值:阈值夹角a就是我们的偏离容忍度。

方向主轴

由于分割的点云组数完全就是基于我们人为规定的主方向数目,则此处是本分割方法的关键。

在我们的方法中,暂时将分组的主轴分为xyz三个向量:【1,0,0】,【0,1,0】,【0,0,1】

容忍度角度设置为40度。

 要怎么选择这些主轴,就全凭大家想象了。

逻辑流

1.录入老朋友bunny.pcd点云,进行法向量估计。

2.设置分组方向主轴,和各个方向的容忍度。

3.计算所有法向量与所有主轴的夹角,将处于容忍度内的法向量归入各个主轴集合。

完整代码

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("../bunny_pcd.pcd")


pcd.paint_uniform_color([0.5, 0.5, 0.5])
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
pcd.orient_normals_consistent_tangent_plane(8)

normals = np.asarray(pcd.normals)

orient_x = [1,0,0]
orient_y = [0,1,0]
orient_z = [0,0,1]
orient_test = [orient_x,orient_y,orient_z]


angle_recolist = []
for i in range(len(normals)):
    angle_recolist_pre = []

    for j in range(len(orient_test)):
        a = np.array(normals[i])
        b = np.array(orient_test[j])

        a_norm = np.sqrt(np.sum(a * a))
        b_norm = np.sqrt(np.sum(b * b))
        cos_value = np.dot(a, b) / (a_norm * b_norm)
        arc_value = np.arccos(cos_value)
        angle_value = arc_value * 180 / np.pi

        if angle_value < 40:
            angle_recolist_pre.append(1)
        else:
            angle_recolist_pre.append(0)
    angle_recolist.append(angle_recolist_pre)


print(angle_recolist)

for i in range(len(angle_recolist)):
    np.asarray(pcd.colors)[i] = angle_recolist[i]


o3d.visualization.draw_geometries([pcd], point_show_normal=False, window_name="三相法向量语义分割",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

 朝向z轴的是蓝色朝向x轴的是红色

 朝向y轴的是绿色

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PCL(Point Cloud Library)是一个用于处理点云数据的开源库,其中包含了许多用于点云分析和处理的算法。PCL可以基于向量点云进行分割。 点云是由大量的点组成的三维数据集。在进行点云分割时,我们希望将点云分成一些具有相似特征的子集,以便进一步进行各种分析和处理。 向量是指点云中每个点周围表面的线方向。通过计算每个点的向量,我们可以获取点云中的结构信息,如平面、曲线等。在基于向量分割点云时,我们通过分析点云中每个点的向量来判断其是否属于同一个表面。 基于向量点云分割算法通常包括以下步骤: 1. 首先,通过某个算法(如最近邻算法)计算每个点的向量。这些向量可以表示点云中每个点周围表面的方向。 2. 接下来,我们选择一个点作为种子点,并按照一定的条件将其加入到一个分割的子集中。 3. 然后,我们检查周围的点,判断它们的向量与种子点的向量是否一致。如果一致,我们将这些点也加入到分割的子集中。 4. 重复步骤3,直到没有点满足条件为止。 5. 最后,我们切换到下一个未分割的点,然后重复步骤2-4,直到所有点都被分割完毕。 基于向量点云分割可以帮助我们识别出点云中的不同表面,例如建筑物的墙面、地面、屋顶等。这对于进一步的点云处理和分析非常有帮助,如物体识别、建模、匹配等应用。PCL提供了丰富的函数和算法,可以方便地实现基于向量点云分割。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三尺流流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值