PCL の構造と入出力

1. PCLの構造とモジュール

1.1 全体構成

  1. PCL の全体的な構造:

1.2 PCLモジュール

  1. PCL は、点群関連の取得、フィルタリング、セグメンテーション、登録、検索、特徴抽出、認識、追跡、表面再構築、視覚化、およびその他の機能を実現できます。
  2. PCL モジュラー コード ライブラリの機能
  • libpcl フィルター: サンプリング、外れ値の除去、特徴抽出、フィッティング推定などのデータ実装フィルター。
  • libpcl 機能: 表面法線、曲率、境界点推定、モーメント不変、主曲率、PFH FPFH 特徴、回転画像、積分画像、NARF 記述子、RIFT、相対標準偏差、データ強度スクリーニングなどの多次元特徴を実現します。
  • libpcl I/O: 点群データ ファイル (PCD) の読み取りと書き込みなどのデータ入出力操作を実装します。
  • libpcl セグメンテーション: 平面、円柱、球、線などの一連のパラメータ モデルに対してモデル フィッティング点群セグメンテーション抽出を実行したり、サンプリングの一貫性を通じて多角柱内の点群を抽出したりするなど、クラスタリング抽出を実装します。
  • libpcl surface は、メッシュ再構成、凸包再構成、移動最小乗算平滑化などの表面再構成技術を実装します。
  • libpcl register: ICP などの点群登録メソッドを実装します。
  • libpcl keypoints: さまざまなキーポイント抽出メソッドを実装します。これは、特徴記述子を抽出する場所を決定するための前処理ステップとして使用できます。
  • libpcl range : さまざまな点群データセットから生成された距離画像のサポートを実装します。

1.3 PointT タイプの PCL

参考ブログ:PCL_Negative OneさんのブログのPointT型の詳細説明 - CSDNブログ

  • PointXYZ------メンバー変数: float x、y、z; これは最も一般的に使用される変数で、3 次元座標の X、Y、Z 値のみが含まれ、位置合わせのために浮動小数点が追加されます。X 値には、points[i].data[0] または point[i].x 経由でアクセスできます。(つまり、内部データ配列と構造体のデータは共通です)
union{
    
    
    float data[4];
    struct{
    
    
        float x;
        float y;
        float z;
    };
};
  • Normal-----float data_n[3], Normal[3], curvature; もう 1 つの一般的に使用されるデータ型である Normal 構造は、指定された点が位置するサンプル表面の法線方向と、その測定値を表します。対応する曲率。たとえば、法線ベクトルの最初の座標には、points[i].data_n[0]、points[i].noraml[0]、または point[i].normal_x を通じてアクセスできます。通常のデータ操作によって上書きされるため、同じ構造になります。
union{
    
    
    float data_n[4];
    float normal[3];
    struct{
    
    
        float normal_x;
        float normal_y;
        float normal_z;
    }
};
union{
    
    
    struct{
    
    
        float curvature;
    }
    float data_c[4];
};

他の種類についてはブログの紹介文を参照していただき、使用する際に確認していただければと思います。

2. PCL I/0 モジュールとクラスの紹介

参考ブログ: PCL ライブラリの I/O 操作 PCD 点群形式と入出力モジュール (I/O) の紹介
PCL の I/O ライブラリは、点群ファイルの入出力に関連する操作クラスを提供し、OpenNI 互換のデバイス ソースをカプセル化します。データ取得インターフェースは、多くのセンシングデバイスから点群画像などのデータを直接取得できます。PCL には、独自設計の内部 PCD ファイル形式があります。

2.1 PCD(点群データ)ファイル形式

PCD ファイルのヘッダーには次のエントリが含まれます。

VERSION——指定 PCD 文件版本。
FIELDS ——指定一个点可 以有的每一个维度和字段的名字。
SIZE——用字节数指定每一个维度的大小。
TYPE——用一个字符指定每 个维度的类型 。现在被接受的类型有I有符号、U无符号、F浮点。
COUNT ——指定每 个维度包含的元素数目。
WIDTH ——用点的数量表示点云数据集的宽度。
HEIGHT——用点的数目表示点云数据集的高度。
VIEWPOINT ——指定数据集中点 的获取视点。
POINTS ——指定点云中点的总数。
DATA 指定存储点云数据的数据类型

PCD ファイル形式の利点:

  1. 順序付けされた点群データセットを保存および処理する機能 - これは、拡張現実や機械学習などのリアルタイム アプリケーションにとって非常に重要です。
  2. バイナリ mmap/munmap データ型は、データをディスクにダウンロードして保存する最も速い方法です。
  3. さまざまなデータ タイプを保存します (すべての基本タイプ: char、short、int、float、double をサポート) - 無効な点が通常 MAN タイプとして保存される場合、点群データが保存および処理中に適応可能かつ効率的になります。
  4. 特徴記述子の n 次元ヒストグラム - 3D 認識およびコンピューター ビジョン アプリケーションにとって重要です。

2.2 PCD形式の点群ファイルの読み込みと書き出し

1.pcd形式ファイルから点群を読み込みます

 #include <iostream>
 #include <pcl/io/pcd_io.h>   // IO模块
 #include <pcl/point_types.h> // 点类型
 
 int main ()
 {
    
    
 	// [1]首先我们使用以下语句创建一个指向pcl::PointXYZ类型的共享指针cloud,此处pcl::PointXYZ类型指的是只有XYZ三个维度位置信息的点云类型。
   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
   
 	// [2]从磁盘加载PointCloud数据(例如文件名为test_pcd.pcd的文件),未成功读取则返回-1
  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
  {
    
    
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
  
  // [3]打印pcd文件中点云的数据量(宽度*高度);
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;
  // [4]打印出文件中点的位置信息,以下方式常用,需熟练使用。
  for (const auto& point: *cloud)
    std::cout << "    " << point.x
              << " "    << point.y
              << " "    << point.z << std::endl;
  return (0);
}

2.点群をpcd形式ファイルに書き込む

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int main ()
 {
    
    
 // 创建点云的基本参数,以下指令描述了我们将要创建的模板化的PointCloud结构。每个点的类型都设置为pcl::PointXYZ,点云宽度为5,高度为1。
   pcl::PointCloud<pcl::PointXYZ> cloud;
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;
  cloud.resize (cloud.width * cloud.height);
// 用随机生成的点向点云模板结构中填入数据
  for (auto& point: cloud)
  {
    
    
    point.x = 1024 * rand () / (RAND_MAX + 1.0f);
    point.y = 1024 * rand () / (RAND_MAX + 1.0f);
    point.z = 1024 * rand () / (RAND_MAX + 1.0f);
  }
// 将点云以ASCII码形式保存成PCD格式文件
  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
  std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;

// 打印点云
  for (const auto& point: cloud)
    std::cerr << "    " << point.x << " " << point.y << " " << point.z << std::endl;

  return (0);
}

おすすめ

転載: blog.csdn.net/weixin_43949950/article/details/126391188