PCL で点群を読み取って表示する 2 つの方法

点群を読み取る 2 つの方法

PCL は、pcd 点群の読み取りと書き込みを行う 2 つの方法を提供します。PCD (点群日付、点群データ) に対応するファイル形式は (*.pcd) であり、PCL の公式指定形式であり、2 つのデータ ストレージ タイプ、ASCII がありますバイナリ

ASCII形式点群はメモ帳で直接表示できます。

バイナリ形式の点群はメモ帳では表示できませんが、メモ帳の方が高速です。

モード 1 PCDReader、PCDWriter

方法 2loadPCDFile ;savePCDFile

1. ハードディスクから点群を読み取る

1.1 ロードPCDファイル

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //创建存放读取点云的对象
	if (pcl::io::loadPCDFile("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================

	return 0;
}

1.2 PCDリーダー

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //创建存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================

	return 0;
}

2. 点群をハードディスクに保存します

2.1 PCDファイルの保存

savePCDFilesavePCDFileASCII一般的に使用される保存形式はと の2 つで、savePCDFileBinaryニーズに応じて 2 つの方法のいずれかを選択できます。

#include <pcl/io/pcd_io.h>
using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================
	//------------------------------- 将点云投影至XOY平面 ----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>); //存放投影后的点云

	//定义cloud_out的大小等参数,防止下标越界
	cloud_out->width = cloud_in->width;
	cloud_out->height = 1;
	cloud_out->is_dense = true;
	cloud_out->points.resize(cloud_out->width*cloud_out->height);

	for (size_t i = 0; i < cloud_in->points.size(); i++)
	{
		cloud_out->points[i].x = cloud_in->points[i].x;
		cloud_out->points[i].y = cloud_in->points[i].y;
		cloud_out->points[i].z = 0;
	}
	//-------------------------------- 将点云保存到硬盘 -----------------------------
	///保存为ASICC格式,可以直接用记事本打开
	if (!cloud_out->empty())
	{
		pcl::io::savePCDFileASCII("ASICC_1.pcd", *cloud_out);
		cout << "->(ASICC)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}

	///保存为Binary格式,不可用记事本打开,但更快速。
	if (!cloud_out->empty())
	{
		pcl::io::savePCDFileBinary("Binary_1.pcd", *cloud_out);
		cout << "->(Binary)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
//==============================================================================
	return 0;
}

2.2 PCDライター

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
//==============================================================================
	//------------------------------- 将点云投影至XOY平面 ----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>); //存放投影后的点云

	//定义cloud_out的大小等参数,防止下标越界
	cloud_out->width = cloud_in->width;
	cloud_out->height = 1;
	cloud_out->is_dense = true;
	cloud_out->points.resize(cloud_out->width*cloud_out->height);

	for (size_t i = 0; i < cloud_in->points.size(); i++)
	{
		cloud_out->points[i].x = cloud_in->points[i].x;
		cloud_out->points[i].y = cloud_in->points[i].y;
		cloud_out->points[i].z = 0;
	}
	//-------------------------------- 将点云保存到硬盘 -----------------------------
	pcl::PCDWriter writer;
	///保存为ASICC格式,可以直接用记事本打开
	if (!cloud_out->empty())
	{
		writer.write("ASICC_2.pcd", *cloud_out,false);	//默认false(可以不写),保存为ASICC格式
		cout << "->(ASICC)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
	///保存为Binary格式,不可用记事本打开,但更快速。
	if (!cloud_out->empty())
	{
		writer.write("Binary_2.pcd", *cloud_out, true);	//true,保存为Binary格式
		cout << "->(Binary)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
//==============================================================================
	return 0;
}

3. 点群の読み取りと書き込みの 2 つの方法の違い

PCDReader とloadPCDFile の違い

//PCDReader
pcl::PCDReader reader;
reader.read("1.pcd",*cloud);

//loadPCDFile
pcl::io::loadPCDFile("1.pcd",*cloud);
  • PCDWriter と savePCDFile の違い
//PCDWriter
pcl::PCDWriter writer;
writer.write("1.pcd",*cloud);

//savePCDFile
pcl::io::savePCDFileBinary("1.pcd",*cloud);

同様に、savePCDFile 関数も PCDWriter を呼び出すことによって実装されます。

//savePCDFile 
template<typename PointT> inline int
    savePCDFile (const std::string &file_name, const pcl::PointCloud<PointT> &cloud, bool binary_mode = false)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, binary_mode));
    }
//savePCDFileASCII 
template<typename PointT> inline int
    savePCDFileASCII (const std::string &file_name, const pcl::PointCloud<PointT> &cloud)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, false));
    }
//savePCDFileBinary
template<typename PointT> inline int
    savePCDFileBinary (const std::string &file_name, const pcl::PointCloud<PointT> &cloud)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, true));
    }

おすすめ

転載: blog.csdn.net/weixin_43925768/article/details/129185845