segmentCurbPoints

Segment curb points from point cloud

Since R2022b

Syntax

``curbPtsIdx = segmentCurbPoints(onRoadPointCloud)``
``curbPtsIdx = segmentCurbPoints(onRoadPointCloud,roadAngles)``
``curbPtsIdx = segmentCurbPoints(onRoadPointCloud,roadAngles,prevCurbPoints)``
``[curbPtsIdx,curbPtCloud] = segmentCurbPoints(___)``
``[___] = segmentCurbPoints(___,Name=Value)``

Description

example

````curbPtsIdx = segmentCurbPoints(onRoadPointCloud)` segments the indices of the feature curb points from an organized point cloud which contains on-road points. A curb usually defines the road boundary, and forms an edge for the sidewalk. ```
````curbPtsIdx = segmentCurbPoints(onRoadPointCloud,roadAngles)` specifies the road angles. The function further processes the feature curb points using these road angles and returns the candidate curb points.```
````curbPtsIdx = segmentCurbPoints(onRoadPointCloud,roadAngles,prevCurbPoints)` specifies the curb points segmented from the previous point cloud frames. The function uses the previous curb points to improve robustness when the input point cloud has occlusions.```
````[curbPtsIdx,curbPtCloud] = segmentCurbPoints(___)` returns the segmented curb points in the on-road point cloud as a `pointCloud` object, using any combination of input arguments from previous syntaxes.```
````[___] = segmentCurbPoints(___,Name=Value)` specifies options using one or more name-value arguments in addition to any combination of arguments from previous syntaxes. For example, `HeightLimits=[0.1 0.3]` specifies the minimum and the maximum height of the road curb as 0.1 and 0.3 meters, respectively.```

Examples

collapse all

Read point cloud data from a PCD file by using the `pcread` function.

`ptCloud = pcread("HDL64LidarData.pcd");`

Organize the point cloud data by using the `pcorganize` function.

`ptCloud = pcorganize(ptCloud,lidarParameters("HDL64E",1024));`

Extract a region of interest, which contains a road, from the point cloud data.

```roi = [-25 25 -10 24 ptCloud.ZLimits]; indices = findPointsInROI(ptCloud,roi); ptCloud = select(ptCloud,indices,OutputSize="full");```

Segment the on-road and off-road points from the point cloud by using the `segmentGroundSMRF` function.

`[~,offRoadPtCloud,onRoadPtCloud] = segmentGroundSMRF(ptCloud);`

`roadAngles = detectRoadAngles(offRoadPtCloud,MinSectorSize=10,SectorMergeThreshold=30);`

Segment curb points from the on-road points of the point cloud.

```[~,curbPtCloud] = segmentCurbPoints(onRoadPtCloud,roadAngles,NumScanNeighbors=10, ... HeightLimits=[0.001 0.5],HeightDeviationLimits=[0.001 0.5], ... SmoothnessThreshold=0.0001,HorizontalAngularResolution=0.33);```

Visualize the segmented curb points.

```figure pcshow(ptCloud.Location,"w") hold on; pcshow(curbPtCloud.Location,"r",MarkerSize=200) hold off view(2) title("Curb points")```

Input Arguments

collapse all

Organized point cloud with on-road points, specified as a `pointCloud` object. The on-road area consists of sidewalks, curb surfaces, and road surfaces. You can apply ground segmentation or plane-fitting algorithms to your point cloud data to extract on-road points. For more details, see Extract On-Road and Off-Road Points from Point Cloud.

Road segmentation angles, specified as an M-element vector. The value of M depends on the road type.

6-way junction6

You can compute road angles by using the `detectRoadAngles` function or input them manually to the function.

When you specify the road angles, the function processes the feature curb points using RANSAC polynomial fitting to return the candidate curb points.

Segmented curb points from the previous point cloud frames, specified as a `pointCloud` object or an array of `pointCloud` objects. These point clouds must be in the `onRoadPointCloud` frame of reference. Detections from the previous frames can improve the robustness of the function when the input point cloud has occlusions.

Name-Value Arguments

Specify optional pairs of arguments as `Name1=Value1,...,NameN=ValueN`, where `Name` is the argument name and `Value` is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Example: `segmentCurbPoints(onRoadPtCloud,HeightLimits=[0.1 0.3])` specifies the minimum and the maximum height of the road curb as 0.1 and 0.3 meters, respectively.

Number of left and right neighbors for each point in a scan line, specified as a positive integer. Increasing this value can improve the accuracy of curb segmentation.

Data Types: `single` | `double` | `int8` | `int16` | `int32` | `int64` | `uint8` | `ete` | `uint16` | `uint32` | `uint64`

Height limits for the road curb, specified as a two-element nonnegative vector of the form [min max]. The min, max values specify the minimum and the maximum height of the road curb, respectively. The typical range of the minimum height is `[0.001, 0.05]`, and the typical range of the maximum height is `[0.15, 0.5]`. The values are in meters.

Data Types: `single` | `double`

Minimum and maximum standard deviation in the curb height, specified as a two-element nonnegative vector of the form [min max]. The min, max values specify the minimum and the maximum standard deviation in the curb height, respectively.

Data Types: `single` | `double`

Minimum smoothness value for curb points, specified as a positive scalar. The typical range of this value is (`0`, `0.005`]. Increasing this value can decrease the number of curb points segmented.

Data Types: `single` | `double`

Horizontal angular resolution of the lidar sensor, specified as a positive scalar in degrees. When you do not specify this value, the function internally computes it as `360/(size(onRoadPointCloud.Location,2))`. The typical range for horizontal angular resolution is `[0.1, 0.4]`. Increasing this value can decrease the number of curb points segmented.

Data Types: `single` | `double`

Output Arguments

collapse all

Binary map of the point cloud with the indices of the curb points, returned as an M-by-N logical matrix. M and N are the number of rows and columns, respectively in the input `onRoadPointCloud`.

Point cloud of the segmented curb points, returned as a `pointCloud` object.

Algorithms

The function extracts curb points from `onRoadPointCloud` using these steps.

1. For each point in a scan line, the function computes these three features.

• Height Difference Feature — Computes the standard deviation and the height maximum difference around a point. The standard deviation and height difference of a curb point must be within the specified `HeightDeviationLimits` and `HeightLimits`, respectively.

• Smoothness Feature — Computes the smoothness of the area around a point. A higher smoothness value indicates that the point is an edge point, and a lower values indicates that the point is a plane point. The smoothness value for a curb point must be greater than the `SmoothnessThreshold` value.

• Horizontal and Vertical Continuity Feature — Computes the horizontal and vertical distance between a point and its immediate neighbors. These horizontal and vertical distance values must be less than the horizontal and the vertical continuity thresholds, respectively. The function computes the thresholds values from the `HorizontalAngularResolution` of the lidar sensor.

2. If a point satisfies all computed features, then it as a feature curb point.

3. If you specify road angles as an input, the function further fine tunes the feature curb points using RANSAC polynomial fitting, and returns the candidate curb points.

Version History

Introduced in R2022b