点群を読み取る 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ファイルの保存
savePCDFile
savePCDFileASCII
一般的に使用される保存形式はと の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));
}