- PCL-Version: Punktwolkenbibliothek | Die Point Cloud Library (PCL)
- Offizielles PCL-Tutorial: Einführung – Dokumentation zur Point Cloud Library 0.0
- Titel#ald1 wird abgerufen
1. Die Struktur und Module von PCL
1.1 Gesamtstruktur
- Die Gesamtstruktur von PCL:
1.2 PCL-Modul
- PCL kann punktwolkenbezogene Erfassung, Filterung, Segmentierung, Registrierung, Abruf, Merkmalsextraktion, Erkennung, Verfolgung, Oberflächenrekonstruktion, Visualisierung und andere Funktionen realisieren:
- 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:
- Die Fähigkeit, geordnete Punktwolkendatensätze zu speichern und zu verarbeiten – dies ist sehr wichtig für Echtzeitanwendungen wie Augmented Reality und maschinelles Lernen.
- Die binären mmap/munmap-Datentypen sind die schnellste Möglichkeit, Daten herunterzuladen und auf der Festplatte zu speichern.
- 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.
- 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);
}