  Flat surfaces captured by 3D point clouds are often used for localization,
mapping, and modeling. Dense point cloud processing has high computation and
memory costs making low-dimensional representations of flat surfaces such as
polygons desirable. We present Polylidar3D, a non-convex polygon extraction
algorithm which takes as input unorganized 3D point clouds (e.g., LiDAR data),
organized point clouds (e.g., range images), or user-provided meshes.
Non-convex polygons represent flat surfaces in an environment with interior
cutouts representing obstacles or holes. The Polylidar3D front-end transforms
input data into a half-edge triangular mesh. This representation provides a
common level of input data abstraction for subsequent back-end processing. The
Polylidar3D back-end is composed of four core algorithms: mesh smoothing,
dominant plane normal estimation, planar segment extraction, and finally
polygon extraction. Polylidar3D is shown to be quite fast, making use of CPU
multi-threading and GPU acceleration when available. We demonstrate
Polylidar3D's versatility and speed with real-world datasets including aerial
LiDAR point clouds for rooftop mapping, autonomous driving LiDAR point clouds
for road surface detection, and RGBD cameras for indoor floor/wall detection.
We also evaluate Polylidar3D on a challenging planar segmentation benchmark
dataset. Results consistently show excellent speed and accuracy.
