1. 程式人生 > >PCL系列1——讀入和輸出pcd格式點雲檔案

PCL系列1——讀入和輸出pcd格式點雲檔案

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

顯示結果如下:
pcl viewer顯示點雲

參考:
1.PCL官網文件-IO