主要内容

segmentLidarData

Segment将三维范围数据组织成簇

描述

例子

标签= segmentLidarData (ptClouddistThreshold段组织了三维范围数据ptCloud成簇。该函数为点云中的每个点分配一个整数集群标签,并返回所有点的集群标签标签

如果两个相邻点的欧几里得距离小于,则函数将它们归为同一簇distThreshold或者传感器与两个相邻点之间的角度至少为5度。

例子

标签= segmentLidarData (ptClouddistThresholdangleThreshold设置将点分组到同一簇的角度约束为angleThreshold

标签numClusters) = segmentLidarData (___也返回集群的数量。

___) = segmentLidarData (___NumClusterPoints =[1,正)还设置每个聚类中的最小和最大点数,指定为2元素向量或标量值。当你指定NumClusterPoints作为一个标量,集群中的最大点数是不受限制的。函数将标签0当集群超出指定范围时。

例子

全部折叠

创建包含两个对象的有组织合成激光雷达数据。

异地恋= 0 (5100);异地恋(:,1:50)= 10;异地恋(:,51:结束)= 20;距= linspace(5) -18年,18日;距= repmat(音高”,1100);偏航= linspace(-90、90100);偏航= repmat(偏航、5、1);

转换到笛卡尔坐标。

X = ldr .* cosd(俯仰).* sind(偏航);Y = ldr .* cosd(俯仰).* cosd(偏航);Z = ldr .* sind(间距);电脑= pointCloud(猫(3,X, Y, Z));图pcshow(电脑。的位置,“r”)标题(“未聚集的点云”

图中包含一个轴对象。标题为Unclustered Point Cloud的axis对象包含一个类型为scatter的对象。

设置阈值。

distThreshold = 5;

分割激光雷达数据。

标签= segmentLidarData (pc, distThreshold);

策划的结果。

图保存标题(“分段集群”) pc1 = select(pc,find(标签== 1));pcshow (pc1。的位置,‘g’) pc2 = select(pc,find(标签== 2));pcshow (pc2。的位置,“y”

图中包含一个轴对象。标题为“分割的集群”的轴对象包含两个散点类型的对象。

设置PCAP文件读取器。

veloReader = velodyneFileReader (“lidarData_ConstructionRoad.pcap”“HDL32E”);

从文件开始等待0.3秒,然后从下一帧读取点云。

veloReader。CurrentTime = veloReader。开始时间+秒(0.3);ptCloud = readFrame (veloReader);

拆下接地面。

groundPtsIdx = segmentGroundFromLidarData (ptCloud);ptCloudWithoutGround =选择(ptCloud ~ groundPtsIdx,“OutputSize”“全部”);

将其余的点聚在一起。距离的单位是米。

distThreshold = 0.5;[标签,numClusters] = segmentLidarData (ptCloudWithoutGround distThreshold);

请为接地点添加附加标签。

numClusters = numClusters + 1;标签(groundPtsIdx) = numClusters;

绘制标记的结果。接地面以黑色显示。

labelColorIndex =标签+ 1;pcshow(ptCloud.Location,labelColorIndex) colormap([hsv(numClusters);[0 0 0]) title(“点云集群”

图中包含一个轴对象。标题为Point Cloud Clusters的轴对象包含一个类型为scatter的对象。

输入参数

全部折叠

点云,指定为pointCloud对象。ptCloud存储点坐标的有组织的点云——- - - - - -N3矩阵。这些点必须按照顺序扫描的顺序由俯仰和偏航角度组织起来,这通常是由激光测距仪和激光测距仪获得的velodyneFileReader

距离阈值,以世界单位表示,指定为非负标量。如果相邻点之间的距离小于距离阈值,则将它们分组到同一簇中。减少输出集群的数量,增加的价值distThreshold

数据类型:|

角度阈值,以度为单位,指定为范围[0,180]内的标量。要减少输出集群的数量,可以降低angleThreshold.当传感器与相邻点形成的角度大于角度阈值时,函数将相邻点分组为同一簇。例如,在图中,如果传感器与点A和点B形成的角度大于,则功能将点A和点B归为同一簇angleThreshold.有关详细信息,请参见算法

数据类型:|

输出参数

全部折叠

点云中所有点的群集标签ptCloud,返回为——- - - - - -N矩阵的整数。每个有效点ptCloud属于集群。集群中的所有点都被分配相同的整型集群标签,范围从1numClusters.无效点,如点同坐标,被分配标签0

集群的数量,返回为正整数。集群数不包括无效点对应的集群,不包括标签值,0,为无效分数保留。

算法

segmentLidarData函数使用距离和角度阈值对相邻点进行聚类。如果两个相邻点的欧几里得距离小于输入,函数将它们分组成同一簇distThreshold或者传感器与相邻点之间的角度大于或等于输入angleThreshold.如果没有指定angleThreshold,函数将这个角设为5度。

例如,假设angleThreshold被设置为90.因为图中角α和角β都大于90度的阈值,所以函数群将点A、点B和点C归为同一簇。因为角σ小于90度的阈值,函数群将点D分成单独的簇。函数用于聚类的每个角度都是由点到传感器的直线和点到相邻点的直线组成的

参考文献

Bogoslavskyi, I.《稀疏三维激光扫描的高效在线分割》。摄影测量、遥感与地理信息科学学报.第85卷,第1期,2017年,41-52页。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

介绍了R2018a