点云分割-pcl区域生长算法

这篇具有很好参考价值的文章主要介绍了点云分割-pcl区域生长算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

1、本文内容
pcl的区域生长算法的使用和原理

2、平台/环境
cmake, pcl
3、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/131927376

原理

参考:https://pcl.readthedocs.io/projects/tutorials/en/master/region_growing_segmentation.html#region-growing-segmentation
https://blog.csdn.net/taifyang/article/details/124097186

这里主要将可设置的参数列出:
KSearch: 用于计算法向量的最近邻点数量,针对K近邻搜索求法向量,也可使用半径搜索求法向量:

  normal_estimator.setKSearch(KSearch);// 30
 // normal_estimator.setRadiusSearch(2);

MinClusterSize: 至少多少点才能构成一个簇
NumberOfNeighbours: 区域生长的近邻点数量
SmoothnessThreshold: 法向量角度阈值,判断当前邻域点和种子点的法向量夹角是否小于此阈值,小于则将当前邻域点加入当前簇
CurvatureThreshold: 曲率阈值,若当前近邻点与种子点夹角小于法向量阈值,并且曲率小于此曲率阈值,则加入种子点

代码

新建文件夹

mkdir pcl_region_growging_segmentation
cd pcl_region_growging_segmentation

pcl_region_growging_segmentation/CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(region_growing_segmentation)

find_package(PCL 1.5 REQUIRED)

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

add_executable (region_growing_segmentation region_growing_segmentation.cpp)
target_link_libraries (region_growing_segmentation ${PCL_LIBRARIES})

pcl_region_growging_segmentation/region_growging_segmentation.cpp

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/region_growing.h>

template <typename PointT>
void PcdVisualizer(pcl::PointCloud<PointT> cloud, bool coordinate = false)
{
  pcl::visualization::PCLVisualizer::Ptr viewer(
      new pcl::visualization::PCLVisualizer("3D Viewer"));
  viewer->setBackgroundColor(0, 0, 0);
  pcl::PointCloud<PointT>::Ptr cloud_ptr(new pcl::PointCloud<PointT>);
  *cloud_ptr = cloud;
  viewer->addPointCloud<PointT>(cloud_ptr, "cloud");
  if (coordinate)
  {
    viewer->addCoordinateSystem(1.0, "global");
  }
  while (!viewer->wasStopped())
  {
    viewer->spinOnce(100);
    // td::this_thread::sleep_for(100ms);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
  }
}

int main(int argc, char **argv)
{
  if (argc < 2)
  {
    std::cout << "please input a pcd" << std::endl;
    return 0;
  }
  std::string pcd_path = argv[1];
  std::cout << "pcd_path: " << pcd_path << std::endl;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  if (pcl::io::loadPCDFile<pcl::PointXYZ>(pcd_path, *cloud) == -1)
  {
    std::cout << "Cloud reading failed." << std::endl;
    return (-1);
  }

  int KSearch = std::atoi(argv[2]);
  int MinClusterSize = std::atoi(argv[3]);
  int NumberOfNeighbours = std::atoi(argv[4]);
  double SmoothnessThreshold = std::atof(argv[5]);
  double CurvatureThreshold = std::atof(argv[6]);

  std::cout << "KSearch: " << KSearch << std::endl;
  std::cout << "MinClusterSize: " << MinClusterSize << std::endl;
  std::cout << "NumberOfNeighbours: " << NumberOfNeighbours << std::endl;
  std::cout << "SmoothnessThreshold: " << SmoothnessThreshold << std::endl;
  std::cout << "CurvatureThreshold: " << CurvatureThreshold << std::endl;

  pcl::search::Search<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
  pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;
  normal_estimator.setSearchMethod(tree);
  normal_estimator.setInputCloud(cloud);
  normal_estimator.setKSearch(KSearch);// 30
  // normal_estimator.setRadiusSearch(2);
  normal_estimator.compute(*normals);

  pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
  reg.setMinClusterSize(MinClusterSize); //50
  reg.setMaxClusterSize(1000000);
  reg.setSearchMethod(tree);
  reg.setNumberOfNeighbours(NumberOfNeighbours); //30
  reg.setInputCloud(cloud);
  reg.setInputNormals(normals);
  reg.setSmoothnessThreshold(SmoothnessThreshold / 180.0 * M_PI); //5.0
  reg.setCurvatureThreshold(CurvatureThreshold); //1.0

  std::vector<pcl::PointIndices> clusters;
  reg.extract(clusters);

  std::cout << "Number of clusters is equal to " << clusters.size() << std::endl;
  std::cout << "First cluster has " << clusters[0].indices.size() << " points." << std::endl;
  std::cout << "These are the indices of the points of the initial" << std::endl
            << "cloud that belong to the first cluster:" << std::endl;
  int counter = 0;
  // while (counter < clusters[0].indices.size ())
  // {
  //   std::cout << clusters[0].indices[counter] << ", ";
  //   counter++;
  //   if (counter % 10 == 0)
  //     std::cout << std::endl;
  // }
  std::cout << std::endl;

  pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();
  PcdVisualizer(*colored_cloud);

  return (0);
}

windows: pcl_region_growging_segmentation/compile.bat

cmake -DCMAKE_BUILD_TYPE=Release -DPCL_DIR="your pcl path whcih including cmake files of pcl" -S ./ -B ./build
cmake --build ./build --config Release --parallel 8 --target ALL_BUILD

for example:

-DPCL_DIR="D:/carlos/install/PCL 1.10.0/cmake"

linux: pcl_region_growging_segmentation/compile.sh

cmake -DCMAKE_BUILD_TYPE=Release -DPCL_DIR="your pcl path whcih including cmake files of pcl" -S ./ -B ./build
cmake --build ./build --config Release --parallel 8 

运行结果

windows: pcl_region_growging_segmentation/run.bat

set PATH=D:\carlos\install\PCL 1.10.0\bin;D:\carlos\install\PCL 1.10.0\3rdParty\FLANN\bin;D:\carlos\install\PCL 1.10.0\3rdParty\VTK\bin;D:\carlos\install\PCL 1.10.0\3rdParty\Qhull\bin;D:\carlos\install\PCL 1.10.0\3rdParty\OpenNI2\Tools;%PATH%
.\build\Release\region_growing_segmentation.exe ^
C:\Users\12538\Downloads\region_growing_tutorial.pcd ^
50 500 30 5 1.0

其中set PATH是设置环境变量,用于运行时能够找到pcl所需要的dll
pcl提供的测试数据:https://raw.github.com/PointCloudLibrary/data/master/tutorials/region_growing_tutorial.pcd
点云分割-pcl区域生长算法,点云算法,pcl,点云算法,点云分割,pcl,c++,cmake

包含建筑,车辆,树木的一个点云数据:
点云分割-pcl区域生长算法,点云算法,pcl,点云算法,点云分割,pcl,c++,cmake

参考

文中已列出

主要做激光/影像三维重建,配准、分割等常用点云算法,技术交流、咨询可私信文章来源地址https://www.toymoban.com/news/detail-606301.html

到了这里,关于点云分割-pcl区域生长算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCL 使用LCCP算法进行点云分割

      LCCP是Locally Convex Connected Patches的缩写,算法大致可以分成两个部分: 基于超体聚类的过分割。 在超体聚类的基础上再聚类。 /

    2024年02月12日
    浏览(36)
  • 【Opencv】图像分割——区域生长

    Python 3.8.8 PyCharm 2021 opencv-python   区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定

    2024年02月05日
    浏览(31)
  • 19 区域生长用于图像分割(matlab程序)

    1. 简述        区域生长法 区域生长的基本思想是将具有相似性质的像素集中起来构建成分割区域。以一组种子点开始,将与种子性质相似(如灰度级)的领域像素附加到生长区域的每个种子上 算法步骤 a.随机选取图像中的一个像素作为种子像素,并将其表示出来 b.检索种子附

    2024年02月13日
    浏览(23)
  • 大盘点!汇总点云分割算法,涉及RANSAC、欧式聚类、区域增长等

    作者:PCIPG-zzl | 来源:计算机视觉工坊 添加微信:dddvisiona,备注:3D点云,拉你入群。文末附行业细分群。 点云分割的目标是将点云数据中的点分成不同的组或类别,使每个组中的点都属于同一种物体或区域。根据空间,几何和纹理等特征对点云进行划分,使同一划分内的

    2024年02月04日
    浏览(31)
  • PCL 建筑物点云立面和平面分割提取

      在建筑物点云中,立面点和平面点的法向量存在明显的差异,根据法向量在Z方向的分量设置相应得阈值即可实现立面点与平面点的分割。

    2024年02月06日
    浏览(28)
  • CloudCompare二次开发之如何通过PCL进行点云分割?

      因笔者课题涉及点云处理,需要通过PCL进行点云数据一系列处理分析,查阅现有网络资料,对常用PCL点云分割进行代码实现,本文记录分割实现过程。    (1)设计.ui文件    ①设计按钮       ②编译.ui       (2)修改mainwindow.h文件       (3)修改ma

    2024年02月05日
    浏览(29)
  • CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

    本文由CSDN点云侠原创,原文链接。爬虫网站自重。   手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。 1、将 ....pluginsexample 路径下的 ExamplePlugin 复制一份并修改名字为 CCPointCloudProcess 。 2、创建窗口UI文件 使用任意Qt工程新建对话

    2023年04月11日
    浏览(43)
  • PCL 改进点云双边滤波算法

    我们先来回顾一下之前该算法的计算过程,在二维图像领域中,双边滤波算法是通过考虑中心像素点到邻域像素点的距离(一边)以及像素亮度差值所确定的权重(另一边)来修正当前采样中心点的位置,从而达到平滑滤波效果。同时也会有选择性的剔除部分与当前采样点“差异”

    2024年02月07日
    浏览(33)
  • PCL中点云分割算法简析

    点云分割算法广泛应用于激光遥感、无人驾驶、工业自动化领域,其原理是根据空间、几何和纹理等特征对点云进行划分,使同一划分内的点云拥有类似的特征。 点云分割算法经过长时间的发展,目前大致可以分为基于随机采样一致的分割算法、基于聚类的分割算法和基于点

    2024年02月03日
    浏览(27)
  • 【PCL】—— 点云配准ICP(Iterative Closest Point)算法

    ​     由于三维扫描仪设备受到测量方式和被测物体形状的条件限制,一次扫描往往只能获取到局部的点云信息,进而需要进行多次扫描,然后每次扫描时得到的点云都有独立的坐标系,不可以直接进行拼接。在逆向工程、计算机视觉、文物数字化等领域中,由于点云的

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包