PCLセグメンテーション研究

切削点クラウドの概要

ポイントクラウドのセグメントは、空間に応じて行われ、幾何学的およびテクスチャ特徴点群は、同じ部門のポイントクラウドが効果点群を分割し、同様の特性を有するように、分割され、例えば、部品の逆、CAD技術で動作し、しばしば多くの用途のための前提条件であります異なる走査面を組み合わせて再利用、修理キャビティ表面再構成、特性評価および抽出し、さらにベースの3Dコンテンツ検索うちより良い実行するために、次に、分割されています。

点群を分割する2.PCL常法

面モデルセグメンテーション(分割面モデル):このアルゴリズムは、セグメント化及びオブジェクトセグメンテーションの背後にいくつかの便利なポイントクラウドに接地面とすることができます。
シリンダーモデルセグメンテーション(分割シリンダーモデル):このアルゴリズムは、オブジェクトのセグメント化の背後にあるいくつかの便利な点群のセグメント化円筒形とすることができます。
ユークリッドクラスタ抽出(ユークリッドクラスタリングエキス):この一般的な方法は、これらn個の間の点がのP0場合は、最寄りのn個の点P0を見て回る、その後、点P0を見つけるために、点群の面で開始します距離が所定の閾値より小さい場合、順次繰り返し除去ポイントを置きます。
領域成長セグメンテーション(領域分割広がり):正常であってもよい通常の曇り点、については、通常の曲率推定アルゴリズムとその曲率の値が得られました。正常および点の曲率によって完了まで拡散外部にクラスか否かが判定されます。
プログレッシブモルフォロジーフィルタ(プログレッシブモルフォロジーフィルタ):すなわち高度を取得レーザー測量データを処理するためのこのアルゴリズム自体は、接地および非接地オブジェクトセグメンテーション、次のステップのための基礎を敷設、他のオブジェクトが地面に浮遊するように分割されてもよいです。

例3いくつかの分割

3.1。単純な分割面

この平面の原理は、模型飛行機変化させることにより、点群のセグメント化アルゴリズムである(AXを+によって+ CZ + D = 0) パラメータ、ある程度最大点にフィットするようにモデルを可能にするパラメータのグループを識別します。この度は、distancethresholdこのパラメータで設定されています。その後、我々はポイントが画面のポイントで取り付けることができるパラメータのセットを見つけます。全体的な感じはしますが、少し複雑なパラメータ調整を理解している場合、このアルゴリズムは良くないということです。
コード:

#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>   //基于采样一致性分割的类的头文件
#include <pcl/filters/extract_indices.h>
#include <pcl/visualization/cloud_viewer.h>

int
 main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

  // 读取一个PCD文件
   if (pcl::io::loadPCDFile<pcl::PointXYZ>("d:/2.pcd", *cloud) != 0)
   {
       return -1;
   }


  //创建分割时所需要的模型系数对象,coefficients及存储内点的点索引集合对象inliers
  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
  // 创建分割对象
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  // 可选择配置,设置模型系数需要优化
  seg.setOptimizeCoefficients (true);
  // 必要的配置,设置分割的模型类型,所用的随机参数估计方法,距离阀值,输入点云
  seg.setModelType (pcl::SACMODEL_PLANE);   //设置模型类型
  seg.setMethodType (pcl::SAC_RANSAC);      //设置随机采样一致性方法类型
  seg.setDistanceThreshold (5);    //设定距离阀值,距离阀值决定了点被认为是局内点是必须满足的条件
                                       //表示点到估计模型的距离最大值,

  seg.setInputCloud (cloud);
  //引发分割实现,存储分割结果到点几何inliers及存储平面模型的系数coefficients
  seg.segment (*inliers, *coefficients);

  if (inliers->indices.size () == 0)
  {
    return (-1);
  }

   pcl::ExtractIndices<pcl::PointXYZ> extract;        //创建点云提取对象
  extract.setInputCloud (cloud);
      extract.setIndices (inliers);
      extract.setNegative (false);
   extract.filter (*cloud);

   //点云可视化
   pcl::visualization::CloudViewer viewer("sa");

       viewer.showCloud(cloud);
        while (!viewer.wasStopped()){
        }

  return (0);
}

前処理:
ここに画像を挿入説明
後処理は:
ここに画像を挿入説明
希望は、あなたが空いている地面、車両を分割して、さらに表示されるトラックの後ろによって処理することができるように、この効果であります

3.2。円筒セグメンテーションモデル

シリンダーモデルの特定の原則のセグメンテーションとスプリットプレーンモデルを理解することがあれば飛行機は、同様のモデルを分割し、その後、分割気筒モデルは、ここではありません詳細については、理解しやすいだろう。

3.3。ユークリッドクラスタリングエキス

このアルゴリズムは、点P0を見つけるために、人気の点群の面で開始、その後最寄りのn個の点P0を見て回る、より少ない所定の閾値よりもP0 n個の点の間の距離ならば、ポイントを置くことです順次、最終的な分割点群の複数の反復を除去しました。
コード:

#include <pcl/io/pcd_io.h>
#include <pcl/segmentation/extract_clusters.h>
#include <QDebug>
#include <pcl/visualization/cloud_viewer.h>

#include <iostream>

int
main(int argc, char** argv)
{
    // 申明存储点云的对象.
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // 读取一个PCD文件
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("d:/2.pcd", *cloud) != 0)
    {
        return -1;
    }
    // 建立kd-tree对象用来搜索
    pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
    kdtree->setInputCloud(cloud);

    // Euclidean 聚类对象.
    pcl::EuclideanClusterExtraction<pcl::PointXYZ> clustering;
    // 设置聚类的最小值 2cm
    clustering.setClusterTolerance(0.2);
    // 设置聚类的小点数和最大点云数
    clustering.setMinClusterSize(1000);
    //clustering.setMaxClusterSize(25000);
    clustering.setSearchMethod(kdtree);
    clustering.setInputCloud(cloud);
    std::vector<pcl::PointIndices> clusters;
    clustering.extract(clusters);
    // For every cluster...
    for (std::vector<pcl::PointIndices>::const_iterator i = clusters.begin(); i != clusters.end(); ++i)
    {
        //添加所有的点云到一个新的点云中
        pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>);
        for (std::vector<int>::const_iterator point = i->indices.begin(); point != i->indices.end(); point++)
        cluster->points.push_back(cloud->points[*point]);
        cluster->width = cluster->points.size();
        cluster->height = 1;
        cluster->is_dense = true;
        //实验预先知道了最大的点云数量,偷懒就不排序查找点云数量最大的点云了
        if(cluster->points.size()>10000){
            //处理后点云显示
            pcl::visualization::CloudViewer viewer("PCL滤波");
            viewer.showCloud(cluster);
            while (!viewer.wasStopped()){
            }
        }
    }
}

前処理:
ここに画像を挿入説明
後処理:
ここに画像を挿入説明
効果は明らかであり、これは非常に近い望ましい結果にあるが、今のデフォルトは、ポイントクラウドトラック、それほど多くの場所の最大数は厳しく、十分ではありません。より良い実装は、他の治療と組み合わせる必要があります。

3.4。地域スプレッド部門

領域成長アルゴリズムと少ないユークリッドアルゴリズムの直感的な感覚は、最終的に分割された領域全体を占め、ポイントから開始しています。距離ユークリッドアルゴリズムは、ポイントが探しの点であり、領域分割アルゴリズムが法線方向を決定するために、曲率によって拡散されているかどうかを決定します。通常のポイントクラウドのために、ポイントに最初は、順序の点の曲率値に追従最小曲率値の点を見つけ、そして種子の位置から開始し、シード点のセットに追加し、ポイントを検索するために周りに開始し、その後の点にポイントを比較します曲率と法線方向との間の隙間は、閾値は、同じクラスタとして扱う未満である場合。クラスタはもはや広げることができた場合、ポイントの人工降雨の残りの部分で表面の小さな曲率を見つけ、その後、トラバーサルが完了するまで繰り返しを継続します。
コード:

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_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>

int
main (int argc, char** argv)
{
    //读取PCL文件
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  if ( pcl::io::loadPCDFile <pcl::PointXYZ> ("d:/2.pcd", *cloud) == -1)
  {
    std::cout << "Cloud reading failed." << std::endl;
    return (-1);
  }


  //创建法线估计对象,估计点云法向量
  pcl::search::Search<pcl::PointXYZ>::Ptr tree = boost::shared_ptr<pcl::search::Search<pcl::PointXYZ> > (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 (50);
  normal_estimator.compute (*normals);


  //创建区域绵延分割对象
  pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
  //设置最小点簇的点数min
  reg.setMinClusterSize (50);
  //reg.setMaxClusterSize (1000000);
  reg.setSearchMethod (tree);
  reg.setNumberOfNeighbours (30);
  //输入点云
  reg.setInputCloud (cloud);

  reg.setInputNormals (normals);
  //设置法线角度差
  reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);
  //设置曲率阈值
  reg.setCurvatureThreshold (1.0);

  std::vector <pcl::PointIndices> clusters;
  //切割处理保存到clusters中
  reg.extract (clusters);


  pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();
  pcl::visualization::CloudViewer viewer ("Cluster viewer");
  viewer.showCloud(colored_cloud);
  while (!viewer.wasStopped ())
  {
  }

  return (0);
}

前処理:
ここに画像を挿入説明
後処理:
ここに画像を挿入説明

4.まとめ

:フィルタリングと研究の細分化することで、車両separated'veは、次のように本当のは、実現可能なアイデアかどうかを特定のアイデアを知らないだ
理由である点群データ、時間のかかるいくつかの処理を行うには、の中間点の多数による1.まず、最初のステップは、ポイントクラウド点群データ削減の元の形状を保持しつつ、ポイントクラウドの顔を処理の速度を向上させるために、ドットの数を減らすために、即ち、達成ダウンサンプリング、ボクセルをフィルタリング使用することです。
2.ランダムサンプルコンセンサス(マルチアウト使用フロント)地面に接地は、ポイントクラウドから分離され、我々は、空いているこの時点で地面上の物体
の離散点の3削除統計フィルタリング
以上の浮動オブジェクト後4さてによって構築、分離ユークリッドクラスタリング抽出Kdtree道路上の異なるオブジェクトは、車両は、その後に取り出されますます。

公開された24元の記事 ウォンの賞賛5 ビュー3938

おすすめ

転載: blog.csdn.net/qq_41345281/article/details/103215713