PCL-Struktur sowie Ein- und Ausgabe

1. Die Struktur und Module von PCL

1.1 Gesamtstruktur

  1. Die Gesamtstruktur von PCL:

1.2 PCL-Modul

  1. PCL kann punktwolkenbezogene Erfassung, Filterung, Segmentierung, Registrierung, Abruf, Merkmalsextraktion, Erkennung, Verfolgung, Oberflächenrekonstruktion, Visualisierung und andere Funktionen realisieren:
  2. Funktionen der modularen PCL-Codebibliothek
  • libpcl-Filter: Datenimplementierungsfilter wie Stichprobenziehung, Entfernen von Ausreißern, Merkmalsextraktion, Anpassungsschätzung usw.
  • libpcl-Funktionen: Realisieren Sie mehrdimensionale Merkmale wie Oberflächennormale, Krümmung, Randpunktschätzung, Momentinvariante, Hauptkrümmung, PFH-FPFH-Merkmale, gedrehtes Bild, Integralbild, NARF-Deskriptor, RIFT, relative Standardabweichung, Datenintensitätsprüfung usw.
  • libpcl-E/A: Implementieren Sie Dateneingabe- und -ausgabevorgänge, z. B. das Lesen und Schreiben von Punktwolkendatendateien (PCD).
  • libpcl-Segmentierung: Implementieren Sie die Cluster-Extraktion, z. B. die Durchführung einer Modellanpassungs-Punktwolken-Segmentierungsextraktion für eine Reihe von Parametermodellen wie Ebene, Zylinder, Kugel, Linie usw. und das Extrahieren von Punktwolken innerhalb von Polygonprismen usw. durch Stichprobenkonsistenz.
  • libpcl surface implementiert Oberflächenrekonstruktionstechniken, wie z. B. Netzrekonstruktion, konvexe Hüllenrekonstruktion, Glättung der kleinsten Multiplikation usw.
  • libpcl-Register: Implementieren Sie Punktwolken-Registrierungsmethoden wie ICP
  • libpcl-Schlüsselpunkte: Implementiert verschiedene Schlüsselpunkt-Extraktionsmethoden, die als Vorverarbeitungsschritt verwendet werden können, um zu entscheiden, wo Feature-Deskriptoren extrahiert werden sollen.
  • libpcl range: Implementiert Unterstützung für Bereichsbilder, die aus verschiedenen Punktwolken-Datensätzen generiert wurden.

1.3 PointT-Typ von PCL

Referenz-Blog: Detaillierte Erläuterung des PointT-Typs im Blog von PCL_Negative One – CSDN-Blog

  • PointXYZ------Mitgliedsvariable: Gleitkomma x, y, z; Dies ist die am häufigsten verwendete Variable, die nur die dreidimensionalen Koordinaten X-, Y- und Z-Werte enthält, und zur Ausrichtung wird ein Gleitkomma hinzugefügt. Auf den X-Wert kann über point[i].data[0] oder point[i].x zugegriffen werden. (Das heißt, das interne Datenarray und die Strukturstrukturdaten sind gemeinsam.)
union{
    
    
    float data[4];
    struct{
    
    
        float x;
        float y;
        float z;
    };
};
  • Normal------float data_n[3], normal[3], curvature; Ein weiterer häufig verwendeter Datentyp, die Normalstruktur, stellt die Normalenrichtung auf der Probenoberfläche dar, auf der sich der angegebene Punkt befindet , und den Messwert des entsprechende Krümmung. Beispielsweise kann auf die erste Koordinate des Normalenvektors über „points[i].data_n[0]“ oder „points[i].noraml[0]“ oder „points[i].normal_x“ zugegriffen werden. Auch hier kann die Krümmung nicht im gespeichert werden dieselbe Struktur, da sie durch normale Datenoperationen überschrieben wird
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];
};

Informationen zu anderen Typen finden Sie in der Blog-Einführung. Sie können sie bei der Verwendung überprüfen.

2. PCL I/0-Modul und Klasseneinführung

Referenzblog: E/A-Operation in der PCL-Bibliothek Einführung in das PCD-Punktwolkenformat und Eingabe- und Ausgabemodul (E/A) Die
E/A-Bibliothek in PCL stellt Operationsklassen für die Eingabe und Ausgabe von Punktwolkendateien bereit und kapselt OpenNI-kompatible Gerätequellen Die Datenerfassungsschnittstelle kann Daten wie Punktwolkenbilder von vielen Sensorgeräten direkt erfassen. PCL verfügt über ein eigenes internes PCD-Dateiformat mit eigenem Design.

2.1 PCD-Dateiformat (Punktwolkendaten).

Der PCD-Dateiheader enthält Einträge:

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

Vorteile des PCD-Dateiformats:

  1. Die Fähigkeit, geordnete Punktwolkendatensätze zu speichern und zu verarbeiten – dies ist sehr wichtig für Echtzeitanwendungen wie Augmented Reality und maschinelles Lernen.
  2. Die binären mmap/munmap-Datentypen sind die schnellste Möglichkeit, Daten herunterzuladen und auf der Festplatte zu speichern.
  3. Speichern Sie verschiedene Datentypen (unterstützt alle Grundtypen: char, short, int, float, double) – wodurch Punktwolkendaten bei der Speicherung und Verarbeitung anpassbar und effizient werden, wo ungültige Punkte normalerweise als MAN-Typen gespeichert werden.
  4. N-dimensionales Histogramm von Merkmalsdeskriptoren – wichtig für 3D-Erkennung und Computer-Vision-Anwendungen.

2.2 Einlesen und Ausschreiben von Punktwolkendateien im PCD-Format

1. Lesen Sie die Punktwolke aus der PCD-Formatdatei ein

 #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. Schreiben Sie die Punktwolke in eine Datei im PCD-Format

#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);
}

Ich denke du magst

Origin blog.csdn.net/weixin_43949950/article/details/126391188
Empfohlen
Rangfolge