主要内容

segmentLidarData

分段将三维距离数据组织成簇

描述

例子

标签= segmentLidarData (ptClouddistThreshold分段组织3-D距离数据ptCloud成簇。该函数为点云中的每个点分配一个整数聚类标签,并返回其中所有点的聚类标签标签

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

例子

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

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

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

例子

全部折叠

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

LDR =零(5,100);Ldr (:,1:50) = 10;Ldr (:,51:end) = 20;Pitch = linspace(-18,18,5);Pitch = repmat(Pitch ', 1100);偏航= linspace(-90,90,100);偏航= repmat(偏航,5,1);

转换成笛卡尔坐标。

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

设置阈值。

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(velereader);

分割并移除接地面。

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

聚类剩下的点。距离的单位是米。

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

为地平面添加一个额外的标签。

numClusters = numClusters+1;labels(groundPtsIdx) = numClusters;

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

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

输入参数

全部折叠

点云,指定为apointCloud对象。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分成一个单独的簇。该函数用于聚类的每个角度都由从一点到传感器的直线以及从该点到邻近点的直线构成

参考文献

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

扩展功能

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

版本历史

在R2018a中引入