首页 > 其他分享 >【PCL】Segmentation 模块—— 平面模型分割(Plane model segmentation)

【PCL】Segmentation 模块—— 平面模型分割(Plane model segmentation)

时间:2025-01-15 10:31:30浏览次数:3  
标签:segmentation pcl 分割 模型 Segmentation seg PCL 平面 cloud

1、简介

PCL(Point Cloud Library)中的平面模型分割(Plane Model Segmentation)是一种从点云数据中提取平面结构的方法。它通过识别点云中符合平面模型的点集,将场景中的平面区域分割出来。

1.1 主要步骤

  1. 选择模型:选择平面模型作为分割目标。
  2. 采样点:随机选取点云中的点用于模型拟合。
  3. 模型拟合:使用采样点拟合平面模型,通常通过最小二乘法或RANSAC算法。
  4. 内点检测:计算所有点到拟合平面的距离,距离小于阈值的点被视为内点。
  5. 分割:将内点标记为属于该平面,并从点云中移除,以便后续处理。

1.2 常用算法

  • RANSAC:鲁棒的拟合算法,能有效处理噪声和离群点。
  • 最小二乘法:适用于噪声较少的点云数据。

1.3 应用场景

  • 室内场景:提取地面、墙面等平面。
  • 机器人导航:识别可通行区域。
  • 三维重建:简化场景几何结构。

2、代码

从给定的点云数据集分割任意平面模型。
兼容性:> PCL 1.3

2.1 planar_segmentation.cpp

#include <iostream>
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>

int main ()
{
  // 读取点云数据
  // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  // pcl::io::loadPCDFile<pcl::PointXYZ>("table_scene_lms400.pcd", *cloud);
  //----------------------------------
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

  // Fill in the cloud data
  cloud->width  = 15;
  cloud->height = 1;
  cloud->points.resize (cloud->width * cloud->height);

  // Generate the data
  for (auto& point: *cloud)
  {
    point.x = 1024 * rand () / (RAND_MAX + 1.0f);
    point.y = 1024 * rand () / (RAND_MAX + 1.0f);
    point.z = 1.0;
  }

  // Set a few outliers
  (*cloud)[0].z = 2.0;
  (*cloud)[3].z = -2.0;
  (*cloud)[6].z = 4.0;
  //----------------------------------
  std::cerr << "Point cloud data: " << cloud->size () << " points" << std::endl;
  for (const auto& point: *cloud)
    std::cerr << "    " << point.x << " "
                        << point.y << " "
                        << point.z << std::endl;

  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
  // Create the segmentation object
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  // Optional
  seg.setOptimizeCoefficients (true);
  // Mandatory
  seg.setModelType (pcl::SACMODEL_PLANE);
  seg.setMethodType (pcl::SAC_RANSAC);
  seg.setDistanceThreshold (0.01);

  seg.setInputCloud (cloud);
  seg.segment (*inliers, *coefficients);

  if (inliers->indices.size () == 0)
  {
    PCL_ERROR ("Could not estimate a planar model for the given dataset.\n");
    return (-1);
  }

  std::cerr << "Model coefficients: " << coefficients->values[0] << " " 
                                      << coefficients->values[1] << " "
                                      << coefficients->values[2] << " " 
                                      << coefficients->values[3] << std::endl;

  std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
  for (const auto& idx: inliers->indices)
    std::cerr << idx << "    " << cloud->points[idx].x << " "
                               << cloud->points[idx].y << " "
                               << cloud->points[idx].z << std::endl;

  return (0);
}

2.2 CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(planar_segmentation)

find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (${PROJECT_NAME} planar_segmentation.cpp)
target_link_libraries (${PROJECT_NAME} ${PCL_LIBRARIES})

3、运行结果

  • 编译运行
mkdir build && cd build
cmake ..
make
./planar_segmentation
  • 运行结果
    在这里插入图片描述
  • 分割过程的图形显示如下(代码中未写可视化,这个只是补充说明)
    在这里插入图片描述

4、核心代码解读

这段代码使用PCL库进行平面模型分割,核心是通过RANSAC算法从点云数据中提取平面:


1. 创建分割对象
pcl::SACSegmentation<pcl::PointXYZ> seg;
  • 创建了一个SACSegmentation对象seg,用于执行基于采样一致性(Sample Consensus, SAC)的分割。
  • 模板参数pcl::PointXYZ表示点云中的点类型为三维点(包含x, y, z坐标)。

2. 设置优化系数(可选)
seg.setOptimizeCoefficients(true);
  • 这是一个可选设置,用于优化模型系数。
  • 如果设置为true,分割算法会在找到初始模型后进一步优化平面模型的系数(如平面的法向量和截距),以提高精度。

3. 设置模型类型(必选)
seg.setModelType(pcl::SACMODEL_PLANE);
  • 设置分割的模型类型为平面模型(SACMODEL_PLANE)。
  • 这意味着算法将尝试从点云中拟合一个平面。

4. 设置方法类型(必选)
seg.setMethodType(pcl::SAC_RANSAC);
  • 设置分割方法为RANSAC(Random Sample Consensus)。
  • RANSAC是一种鲁棒的拟合算法,能够有效处理噪声和离群点。它通过随机采样点来拟合模型,并选择内点(符合模型的点)最多的模型。

5. 设置距离阈值(必选)
seg.setDistanceThreshold(0.01);
  • 设置点到模型的最大距离阈值,用于判断点是否为内点。
  • 如果一个点到拟合平面的距离小于0.01(单位与点云数据一致),则该点被视为内点。
  • 这个值需要根据点云的尺度调整,值越小,拟合的平面越精确,但可能遗漏一些点;值越大,拟合的平面可能不够精确。

6. 设置输入点云
seg.setInputCloud(cloud);
  • 将待分割的点云数据cloud设置为分割对象的输入。
  • cloud是一个pcl::PointCloud<pcl::PointXYZ>::Ptr类型的指针,指向点云数据。

7. 执行分割
seg.segment(*inliers, *coefficients);
  • 执行分割操作。
  • inliers是一个pcl::PointIndices::Ptr类型的指针,用于存储分割结果中的内点(即属于平面的点)的索引。
  • coefficients是一个pcl::ModelCoefficients::Ptr类型的指针,用于存储拟合平面的模型系数(平面方程ax + by + cz + d = 0的系数a, b, c, d)。

总结

这段代码的核心是通过RANSAC算法从点云中提取平面:

  1. 创建一个分割对象。
  2. 设置平面模型和RANSAC方法。
  3. 设置距离阈值以判断内点。
  4. 输入点云数据并执行分割。
  5. 输出内点索引和平面模型系数。
输出结果
  • inliers:包含所有属于平面的点的索引。
  • coefficients:包含平面方程的系数(a, b, c, d),表示平面方程ax + by + cz + d = 0

如果点云中没有找到平面,inliers->indices将为空。

标签:segmentation,pcl,分割,模型,Segmentation,seg,PCL,平面,cloud
From: https://blog.csdn.net/old_power/article/details/145154208

相关文章

  • 第1章 PCL点云库核心基础:PCD点云数据及point_types和point_cloud点云类型源码详细解读
    一、PCL点云PCD文件原始数据在PCL点云库中,点云的原始数据可以包含多种字段,这些字段根据不同的应用场景和数据采集设备有所不同。最常见的点云数据存储在PCD(PointCloudData)文件格式中,其主要字段包括:#.PCDv0.7-PointCloudDatafileformat//注释VERSION0.7......
  • 第2.0章 PCL点云滤波方法原理及代码实例最全总结
    以下是对PCL(PointCloudLibrary)中各种滤波方法的总结,包括原理、所需头文件、机器人SLAM中的代码应用实例及使用说明:一、体素网格滤波(VoxelGridFilter)原理:体素网格滤波将三维空间划分为一个个小的立方体,即体素(Voxel)。对于每个体素,根据用户设定的体素尺寸,通过某种策......
  • 第0章 点云库(PCL)学习开篇:发展历史、SLAM应用与学习指南
    一、PCL的历史PointCloudLibrary(PCL)是一个功能强大的开源库,专门用于处理点云数据。它的发展是为了满足计算机视觉、机器人学、自动驾驶、逆向工程等多个领域对点云处理日益增长的需求。PCL起源于早期的点云处理工具和算法的积累,在开源社区和学术界的共同努力下逐渐发......
  • C# .NetCore HttpClient 标题名称 Content-Type、content-md5、Accept误用 确保请求头
    异常消息:        异常1、Misusedheadername,'Content-Type'.MakesurerequestheadersareusedwithHttpRequestMessage,responseheaderswithHttpResponseMessage,andcontentheaderswithHttpContentobjects        大概意思:标题名称“Cont......
  • PCL点云库入门——PCL库点云特征之FPFH点快速特征直方图(Fast Point Feature Histogram
    1、FPFH原理        快速点特征直方图(FastPointFeatureHistograms,简称FPFH)是对PFH(PointFeatureHistograms)计算方法的一种简化,具体内容看参考十四节内容。该方法的核心在于独立计算查询点的K邻域内每个点的简化点特征直方图(SimplifiedPointFeatureHistogram,简......
  • HttpClient
    HttpClient简介HttpClient是ApacheHttpComponents项目中的一个接口。用于发送HTTP请求和接收HTTP响应。CloseableHttpClient是HttpClient接口的一个具体实现类,提供了自动管理连接资源的功能,包括连接的创建、使用和关闭。HttpClient4.5之后新增的功能。CloseableHttpClient本......
  • PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化
    1、PCL点云库中点云特征综述  1.1、点云特征综述        点云特征描述在三维数据处理领域扮演着至关重要的角色,它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中,我们可以看到基于几何形状的特征、基于统计信息的特征以及基于变......
  • java 使用HttpClient发送post请求,参数包括MultipartFile、Map以及File转MockMultipart
        遇到使用java调用其他系统的http接口时,发送的参数中有文件,不太好处理,如下总结了发送带文件的的http方法,发送的文件还需要先将File转成MockMultipartFile否则接收会报错。关键的代码和依赖如下所示。一、依赖<dependency><groupId>org.apache.httpcomponents</......
  • 编译android版本的pcl库
    pcl是做什么的在此就不解释了,否则你也不会点开这篇博客看,直入主题。1、Miniconda装Miniconda的目的是因为pclandroid编译包用到了conan,为了不污染整个python环境,使用miniconda创建一个新环境,这个直接跟着官网步骤走。mkdir-p~/miniconda3wgethttps://repo.anaconda.com/......
  • PCL的安装和环境配置
    1、软件下载下载vs2022和PCL1.8.1vs2022:https://visualstudio.microsoft.com/downloadsPCL1.8.1:https://download.csdn.net/download/qq_29385297/902061382、PCL安装直接运行PCL-1.8.1-AllInOne-msvc2017-win64.exe选择AddPCLtothesystemPATHforallusers选项......