点云库(PCL)学习——I/O

1.PCD(Point Cloud Data)文件格式

1.PCD并不是第一个支持三维点云的格式。特别是计算机图形学和计算几何界,已经创造了许多格式来描述使用激光扫描仪获得的任意多边形和点云。比如:PLY,STL,OBJ,X3D等。在当今的传感器技术以及算法被发明之前,这些格式就因为不同的目的在不同的时间相继被创造出来,它们也存在着多多少少的缺陷。
2.文件格式头文件:每个PCD文件都包含了一个头文件来定义和声明点云数据的某些属性(properties)并存储在文件里。PCD的头文件必须用ASCII编写。

NOTE:每个头文件条目(header entry)以及ASCII点云数据都在PCD文件中明确,并以行隔开。
0.7版本的PCD头文件包含以下条目:VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、D,头文件条目必须严格按照上述顺序指定标题条目。

2.从PCD文件中读取点云数据

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int
main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);//创建一个PointCloud<PointXYZ>boost共享指针并初始化

  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");//从磁盘加载PointCloud数据
    return (-1);
  }
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;
  for (const auto& point: *cloud)
    std::cout << "    " << point.x
              << " "    << point.y
              << " "    << point.z << std::endl;//显示加载的数据

  return (0);
}

3.向PCD文件中写点云数据

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int
  main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud;

  // Fill in the cloud data
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;
  cloud.points.resize (cloud.width * cloud.height);

  for (auto& point: cloud)
  {
    point.x = 1024 * rand () / (RAND_MAX + 1.0f);
    point.y = 1024 * rand () / (RAND_MAX + 1.0f);
    point.z = 1024 * rand () / (RAND_MAX + 1.0f);
  }

  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
  std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;

  for (const auto& point: cloud)
    std::cerr << "    " << point.x << " " << point.y << " " << point.z << std::endl;

  return (0);
}

4.连接(concatenate)两个点云的点

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int main (int argc, char** argv)
{
	if (argc !=2) //限制参数为2个
	{
		std::cerr << "please specify command line arg '-f' or '-p'" << std::endl;
		exit(0);
	}
	pcl::PointCloud<pcl::PointXYZ> cloud_a, cloud_b, cloud_c;
	plc::PointCloud<pcl::Normal> n_cloud_b;
	pcl::PointCloud<pcl::PointNormal> p_n_cloud_c;

	//Fill in the cloud data
	cloud_a.width = 5;
	cloud_a.height = cloud_b.height = n_cloud_b.height = 1;
	cloud_a.points.resize(cloud_a.width * cloud_a.height);
	if (strcmp(argv[1], "-p") == 0)
	{
		cloud_b.width = 3;
		cloud_b.points.resize(cloud_b.width*cloud_b.height);
	}
	else{
		n_cloud_b.width = 5;
		n_cloud_b.points.resize(n_cloud_b.width*n_cloud_b.height);
	}
	for (std::size_t i = 0; i<cloud_a.size(); ++i)
	{
	cloud_a[i].x = 1024*rand()/(RAND_MAX + 1.0f);
	cloud_a[i].y = 1024*rand()/(RAND_MAX + 1.0f);
	cloud_a[i].z = 1024*rand()/(RAND_MAX + 1.0f);
	}
	if (strcmp(argv[1], "-p") == 0)
		for (std::size_t i = 0; i<cloud_b.size(); ++i)
		{
			cloud_b[i].x = 1024*rand()/(RAND_MAX + 1.0f);
			cloud_b[i].y = 1024*rand()/(RAND_MAX + 1.0f);
			cloud_b[i].z = 1024*rand()/(RAND_MAX + 1.0f);
		}
	else
		for (std::size_t i = 0; i<n_cloud_b.size(); ++i)
		{
			n_cloud_b[i].normal[0] = 1024*rand()/ (RAND_MAX + 1.0f);
			n_cloud_b[i].normal[1] = 1024*rand()/ (RAND_MAX + 1.0f);
			n_cloud_b[i].normal[2] = 1024*rand()/ (RAND_MAX + 1.0f);
		}
	std::cerr<<"Cloud A : " << std::endl;
	for (std::size_t i = 0; i<cloud_a.size(); ++i)
	std::cerr<< "   " << cloud_a[i].x << "  " << cloud_a[i].y << "  " << cloud_a[i].z << std::endl;
	std::cerr<<"Cloud B: " << std::endl;
	if (strcmp(argv[1], "-p") == 0)
		for (std::size_t i = 0; i<cloud_b.size (); ++i)
			std::cerr<<"   " << cloud_b[i].x << " " << cloud_b[i].y << " " << cloud_b[i].z << std::endl;
	else
		for (std::size_t i = 0; i < n_cloud_b.size (); ++i)
			std::cerr << "    " << n_cloud_b[i].normal[0] << " " << n_cloud_b[i].normal[1] << " " << n_cloud_b[i].normal[2] << std::endl;
	if (strcmp(argv[1], "-p") == 0)
	{
		cloud_c = cloud_a;
		cloud_c += cloud_b;
		std::cerr << "Cloud C: " << std::endl;
		for (std::size_t i = 0; i < cloud_c.size (); ++i)
			std::cerr << "    " << cloud_c[i].x << " " << cloud_c[i].y << " " << cloud_c[i].z << " " << std::endl;
	}
	else
	{
	pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c);
	std::cerr << "Cloud C: " << std::endl;
	for (std::size_t i = 0; i < p_n_cloud_c.size (); ++i)
		std::cerr << "    " <<
		p_n_cloud_c[i].x << " " << p_n_cloud_c[i].y << " " << p_n_cloud_c[i].z << " " << p_n_cloud_c[i].normal[0] << " " << p_n_cloud_c[i].normal[1] << " " << p_n_cloud_c[i].normal[2] << std::endl;
	}
	reture (0);
}
PCL学习教程是关于点云(Point Cloud Library)的教程,该可以用于处理和分析来自传感器的三维点云数据。学习PCL的教程通常包括以下内容: 1. 安装PCL:首先,你需要安装PCL及其依赖项。具体的安装方法可以参考PCL官方网站上的文档。 2. 点云数据的读取和可视化:学习如何读取和可视化点云数据是PCL学习的第一步。使用PCL提供的函数和类,你可以读取来自传感器的点云数据,并将其可视化以便观察和分析。 3. 点云滤波:PCL提供了各种滤波器,用于去除点云中的噪声、采样和下采样,以及提取感兴趣的特征。 4. 特征提取:学习如何从点云中提取表面特征,例如平面、曲率、法线等。 5. 点云配准:点云配准是将多个点云对齐到一个共同的坐标系中的过程。PCL提供了各种配准算法,包括ICP(迭代最近点)和SAC-IA(随机一致性),用于实现点云的配准。 6. 点云分割:点云分割是将点云分成多个不同的部分或对象的过程。PCL提供了各种分割算法,例如基于颜色、法线、平面模型等的分割算法。 7. 点云配准和分割的应用:学习如何将点云配准和分割应用于实际问题,例如机器人导航、三维重建和目标检测等。 在学习PCL时,你可以通过阅读PCL官方文档、实践示例代码和参加相关培训课程等方式来深入了解和掌握PCL的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值