PCL系列1——讀入和輸出pcd格式點雲檔案
阿新 • • 發佈:2018-12-04
1.從檔案讀取點雲
寫法1:
//1.loadPCDFile讀取點雲
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("車載道路2.pcd", *cloud1) == -1)
{
PCL_ERROR("Cloudn't read file!");
return -1;
}
cout << "1.loadPCDFile方式使用指標讀取點個數: " << cloud1->points.size() << endl;
寫法2:
//2.讀取點雲
pcl::PointCloud<pcl::PointXYZ> cloud;
if (pcl::io::loadPCDFile<pcl::PointXYZ>("車載道路2.pcd", cloud) == -1)
{
PCL_ERROR("Cloudn't read file!");
return -1;
}
cout << "2.loadPCDFile方式使用物件讀取點個數: " << cloud. points.size() << endl;
寫法3:
//3.PCDReader讀取點雲
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>("車載道路2.pcd", *cloud2);
cout << "3.PCDReader方式讀取點個數: " << cloud2->points.size( ) << endl;
2.輸出點雲到檔案
寫法1:
//4.savePCDFile方式點雲輸出
pcl::io::savePCDFile<pcl::PointXYZ>("車載道路2_.pcd", cloud); //預設二進位制方式儲存
pcl::io::savePCDFileASCII<pcl::PointXYZ>("車載道路2_ASCII.pcd", cloud); //ASCII方式儲存
pcl::io::savePCDFileBinary<pcl::PointXYZ>("車載道路2_Binary.pcd", cloud); //二進位制方式儲存
寫法2:
//5.PCDWriter方式點雲輸出
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ>("1車載道路2_.pcd", cloud); //預設二進位制方式儲存
writer.writeASCII<pcl::PointXYZ>("1車載道路2_ASCII.pcd", cloud); //ASCII方式儲存
writer.writeBinary<pcl::PointXYZ>("1車載道路2_Binary.pcd", cloud); //二進位制方式儲存
3.總結
loadPCDFile()與savePCDFile函式內部其實是呼叫的reader.read()和writer.write函式,所以上面的不同寫法本質上是都一樣的。
4.原始碼
#include <iostream>
#include <fstream>
#include <pcl/io/pcd_io.h> //檔案輸入輸出
#include <pcl/point_types.h> //點型別相關定義
#include <pcl/visualization/cloud_viewer.h> //點型別相關定義
using namespace std;
int main()
{
//1.loadPCDFile讀取點雲
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("車載道路2.pcd", *cloud1) == -1)
{
PCL_ERROR("Cloudn't read file!");
return -1;
}
cout << "1.loadPCDFile方式使用指標讀取點個數: " << cloud1->points.size() << endl;
//2.讀取點雲
pcl::PointCloud<pcl::PointXYZ> cloud;
if (pcl::io::loadPCDFile<pcl::PointXYZ>("車載道路2.pcd", cloud) == -1)
{
PCL_ERROR("Cloudn't read file!");
return -1;
}
cout << "2.loadPCDFile方式使用物件讀取點個數: " << cloud.points.size() << endl;
//3.PCDReader讀取點雲
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>("車載道路2.pcd", *cloud2);
cout << "3.PCDReader方式讀取點個數: " << cloud2->points.size() << endl;
//4.savePCDFile方式點雲輸出
//pcl::io::savePCDFile<pcl::PointXYZ>("車載道路2_.pcd", cloud); //預設二進位制方式儲存
pcl::io::savePCDFileASCII<pcl::PointXYZ>("車載道路2_ASCII.pcd", cloud); //ASCII方式儲存
//pcl::io::savePCDFileBinary<pcl::PointXYZ>("車載道路2_Binary.pcd", cloud); //二進位制方式儲存
//5.PCDWriter方式點雲輸出
pcl::PCDWriter writer;
//writer.write<pcl::PointXYZ>("1車載道路2_.pcd", cloud); //預設二進位制方式儲存
writer.writeASCII<pcl::PointXYZ>("1車載道路2_ASCII.pcd", cloud); //ASCII方式儲存
//writer.writeBinary<pcl::PointXYZ>("1車載道路2_Binary.pcd", cloud); //二進位制方式儲存
//6.顯示點雲
pcl::visualization::CloudViewer viewer("cloud viewer");
viewer.showCloud(cloud1);
system("pause");
return 0;
}
顯示結果如下:
參考:
1.PCL官網文件-IO