提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
pcl读取各类型点云(C++),包括:pcd、ply、txt,后续遇到新类型继续补充
一、pcl读取pcd文件
#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
int main()
{
std::string filename = "../.pcd";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(filename, *cloud) == -1)
{
std::cout << "error to read point cloud" << std::endl;
return -1;
}
/****显示点云****/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
二、pcl读取ply文件
#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
int main()
{
std::string filename = "../.ply";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPLYFile<pcl::PointXYZ>(filename, *cloud) == -1)
{
std::cout << "error to read point cloud" << std::endl;
return -1;
}
/****显示点云****/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
三、pcl读取txt文件
#define BOOST_TYPEOF_EMULATION
#include <vtkAutoInit.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
void creat_pointcloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
int mian()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::string filename = "../.txt";
creat_pointcloud_from_txt(filename, cloud);
if (cloud->size() == 0)
{
std::cout << "error to read point cloud" << std::endl;
return -1;
}
/****显示点云****/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 255, 255);
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
/** 从txt文件中读取点云数据,这里只有X,Y,Z三坐标 **/
void creat_pointcloud_from_txt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
std::ifstream file(file_path.c_str()); // 打开文件,.c_str将“file_path”转换为c风格字符串
std::string line; // 用于临时存储txt文件中的每一行数据。
pcl::PointXYZ point; // 用于读取txt文件中的点坐标
if (file.is_open()) // 判断文件是否被打开
{
while (getline(file, line)) // 读取txt文件中的一行,默认遇到“/n”停止
{
std::stringstream ss(line); // 将这一行的字符串转换s为输入流,以便提取数据
ss >> point.x;
ss >> point.y;
ss >> point.z;
cloud->push_back(point); // 将读取的数据添加进cloud中
}
file.close(); // 关闭文件流
}
else // 错误处理
{
std::cout << " 无法打开文件 " << std::endl;
}
}