PCL研究ノート-データの入力と出力
1.PCDファイルから点群ファイルを読み取って保存します
pcl :: io :: loadPCDFile
#include <iostream> //标准C++库输入输出相关头文件
#include <pcl/io/pcl_io.h> //pcd读写相关头文件
#include <pcl/point_types.h> //pcl中支持的点类型头文件
//点云格式的宏定义,即使用PointT代替pcl::PointXYZ
typedef pcl::PointXYZ PointT;
int main(int argc, char** argv)
{
//定义点云指针
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
//pcl::io::loadPCDFile<PointT>函数导入pcd文件,并将点云存储在cloud中,如果未读取到则为-1
if(pcl::io::loadPCDFile<PointT>("abc.pcd", *cloud) == -1)
{
PCL_ERROR("couldn't read file\n");//PCL_ERROR是pcl中输出错误信息的函数
return(-1);
}
std::cout<<"点云大小"<<cloud->size()<<std::endl;
//pcl::io::savePCDFile函数将cloud点云存储在save.pcd文件中
pcl::io::savePCDFile("save.pcd",*cloud);
sysrem("pause");
return(0);
pcl :: PCDReaderリーダー
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
int
main (int argc, char** argv)
{
pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
// 从文件读取点云图
// Fill in the cloud data
pcl::PCDReader reader;
// Replace the path below with the path where you saved your file
reader.read ("./data/table_scene_lms400.pcd", *cloud); // Remember to download the file first!
std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
<< " data points (" << pcl::getFieldsList (*cloud) << ").";
// 创建一个长宽高分别是1cm的体素过滤器,cloud作为输入数据,cloud_filtered作为输出数据
float leftSize = 0.01f;
// Create the filtering object
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud (cloud);
sor.setLeafSize (leftSize, leftSize, leftSize);
sor.filter (*cloud_filtered);
std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
<< " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";
// 将结果输出到文件
pcl::PCDWriter writer;
writer.write ("./data/table_scene_lms400_downsampled.pcd", *cloud_filtered);
return (0);
}
2.PLYファイルを読み取って保存します
接尾辞は、一般的に使用される点群データファイルである.ply形式のファイルとして名前が付けられています。プライファイルはポイントデータだけでなくグリッドデータも保存できます。エディターでプライファイルを開いてヘッダーを観察します。ヘッダーの要素面の値が0の場合、そのファイルはポイントクラウドファイルであることを意味します。値が正の整数Nの場合、ファイルがグリッドファイルであり、N個のグリッドが含まれていることを意味します。したがって、pcl :: PointCloud :: Ptrクラウド(新しいpcl :: PointCloud)を使用するだけでなく、pclを使用してプライファイルを読み取ります。読んだ。プライファイルを読み取るときは、最初にファイルが点群であるかグリッドファイルであるかを区別する必要があります。ポイントクラウドファイルの場合は、一般的なポイントクラウドクラスに従って読み取ることができます。プライファイルがグリッドクラスの場合は、次のものが必要です。
#include <pcl / io / ply_io.h> // plyのヘッダーを導入するファイル読み取りファイル
pcl::PolygonMesh mesh; //定义用于存储ply网格文件的变量
pcl::io::loadPLYFile("readName.ply", mesh); //读取ply网格文件
pcl::io::savePLYFile("saveName.ply", mesh); //保存ply网格文件
プライグリッドの完全なコード例を示します。
#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/ply/ply.h>
#include <pcl/console/parse.h>
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/PolygonMesh.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/vtk_lib_io.h>
//#include <pcl/io/vtk_lib_io.hpp>
#include <pcl/io/vtk_io.h>
#include <stdlib.h>
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;
using namespace std;
int
main(int argc, char** argv)
{
//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
PolygonMesh cloud;
//boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
pcl::visualization::PCLVisualizer viewer("PCL PolygonMesh");
string filename = "Output_.ply";
pcl::io::loadPolygonFilePLY(filename, cloud);
viewer.addPolygonMesh(cloud);
viewer.setBackgroundColor(0.2, 0.0, 0.0);
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
PLYポイントクラウドファイルの読み取り例:
int readcloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, string filename) {
// PointXYZ表示三维坐标信息
// 读取ply文件
if (pcl::io::loadPLYFile<pcl::PointXYZ>(filename, *cloud) == -1) {
//PCL_ERROR("Couldnot read file.\n");
cout << "Couldnot read file." << endl;
system("pause");
return -1;
}
cout << "已读取并显示"<<filename<<"原始点云数据" << endl;
cout << filename<<"原始点云数据点数:" << cloud->points.size() << endl;
return 0;
}