学习点云和pcl算法初步①

**

点云学习初步1

**
pcl编码风格:https://www.cnblogs.com/zhongllmm/p/15965846.html

pcl支持的点云格式:
.pcd //PCL官方指定格式,具有ASCII和binary两种数据存储类型,pcd格式具有文件头,用于描绘点云的整体信息
.ply //一种由斯坦福大学的Turk等人设计开发的多边形文件格式,因而也被成为斯坦福三角格式。文件格式有文本和二进制两种格式
.obj //OBJ文件是一种标准的3D模型文件格式
.xyz(ascii) //一种文本格式,前面3个数字表示点坐标,后面3个数字是点的法向量,数字间以空格分隔
.vtk
.png
.tif
.las //LiDAR数据的工业标准格式,是一种二进制文件格式
参考链接:https://blog.csdn.net/qq_60143666/article/details/122470154

pcd文件的读写:

//依赖的头文件
#include<iostream>
#include<pcl/io/pcd_io.h>//PCD读写类相关的头文件
#include<pcl/point_types.h>//pcl支持的点类型文件

typedef pcl::PointXYZ PointT;//别名
typedef pcl::PointCloud<PointT>PointCloud;
PointCloud::Ptr cloud(new PointCloud);//等同 pcl::PointCloud<pcl::PointXYZ>::Ptr

1.读取
//方法一
pcl::PCDReader reader;
reader.read("xxx.pcd",*cloud)
//方法二
pcl::io::loadPCDfile("xxx.pcd",*cloud);


2.保存
//方法一
pcl::PCDWriter writer;
writer.writer("xxx.pcd",*cloud);
writer.writeBinary("xxx.pcd,*cloud);//大文件使用二进制,速度更快
writer.witeASCII("xxx.pcd,*cloud)
writer.writerBinaryCompressed("xxx.pcd",*cloud)

//方法二
pcl::io::savePCDFile("xxx.pcd",*cloud);
pc::io::savePCDfileASCII("xxx.pcd",*cloud);
pcl::io::savePCDFileBinary("xxx.pcd"*cloud)
pcl::io::savepcdFileBinaryCompressed("xxx.pcd",*cloud)

ply文件的读写:

//与pcd文件读取类似

//依赖的头文件
#include<iostream>
#include<pcl/io/ply_io.h>//Ply读写类相关的头文件
#include<pcl/point_types.h>//支持的点类型文件

typedef pcl::PointXYZ PointT;//别名
typedef pcl::PointCloud<PointT>PointCloud;
PointCloud::Ptr cloud(new PointCloud);//等同 pcl::PointCloud<pcl::PointXYZ>::Ptr

1.读取
//方法一
pcl::PLYReader reader;
reader.read("xxx.ply",*cloud)
//方法二
pcl::io::loadPLYfile("xxx.ply",*cloud);


2.保存
//方法一
pcl::PCDWriter writer;
writer.writer("xxx.ply",*cloud);
writer.writeBinary("xxx.ply,*cloud);//大文件使用二进制,速度更快
writer.witeASCII("xxx.ply,*cloud)
writer.writerBinaryCompressed("xxx.ply",*cloud)

//方法二
pcl::io::savePCDFile("xxx.ply",*cloud);
pc::io::savePCDfileASCII("xxx.ply",*cloud);
pcl::io::savePCDFileBinary("xxx.ply"*cloud)
pcl::io::savepcdFileBinaryCompressed("xxx.ply",*cloud)

拼接点云

1.拼接相同类型点云,点数可以不相同,包含相同字段
2.连接具有不同字段的点云,要求点数相等,拼接不同的属性。

pcl::PointCloud<pcl::PointXYZ>cloud_a,cloud_b.cloud_c;
pcl::PointCloud<pcl::Normal>n_cloud_b;
pcl::PointCloud<pcl::PointNormal>p_n_cloud_c;

1.拼接点云
cloud_c=cloud_a;
cloud_c+=cloud_b;//连接点云
2.连接点云
pcl::concatenateFields(cloud_a,cloud_b,p_n_cloud_c);//连接字段,a和b的点数相同

虚拟地形项目库https://vterrain.org/
麻省理工城市大规模数据http://modelnet.cs.princeton.edu/
http://shape.cs.princeton.edu/benchmark/

kdtree

kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。

#include<iostream>
#include <pcl/point_cloud.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<vector>
pcl::kdTreeFLANN<pcl::PointXYZ>kdtree;//定义一个kdtree
kdtree.setinputCloud(cloud);//输入点云


**K近邻搜索**
pcl::PointXYZ searchPoint;
int k=10;//临近点数量
std::vector<int>pointIdxNKNSearch(K);
std::vector<float>pointNKNSquaredDistance(k);
int num=kdtree.nearestKSearch(searchPoint,k,pointIdxNKNSearch,pointNKNSquaredDistance)//搜索的点,搜索范围,存储搜索到的点,搜索到点的距离)

**在半径r内搜索近邻**
std::vector<int>pointIdxRadiusSearch;
std::vector<float>pointRadiusSquaredDistance;
int num=kdtree.radiusSearch(searchPoint,radius,pointIdxRadiusSearch,pointRadiusSquaredDistance)


octree

三维空间下的八叉树

#include <pcl/point_cloud.h>
#include<pcl/octree/octree.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//有一点困惑? 答:Ptr是智能指针,看其他文章详解
float resolution=128.0f;//分辨率  根据格子大小来拟定
pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);//有一点困惑
octree.setInputCloud(cloud);//点云输入其中
octree.addPointsFromInputCloud();//比kdtree多一句
pcl::PointXYZ searchPoint;

**体素内近邻搜索**
std::vector<int>pointIdxVec;
octree.voxelSearch(searchPoint,pointIdxVec)

**K近邻搜索**
int k=10;//临近点数量
std::vector<int>pointIdxNKNsearch;
std::vector<float>pointNKNSquaredDistance;
int num=octree.nearestkSearch(searchPoint,k,pointIdxNKNSearch,pointNKNSSquaredDistance)//搜索的点,搜索范围,存储搜索到的点,搜索到点的距离)

**半径内近邻搜索**
std::vector<int>pointIdxRadiusSearch;
std::vector<float>pointRadiusSquaredDistance;
int num=octree.radiusSearch(searchPoint,radius,pointIdxRadiusSearch,pointRadiusSquaredDistance)

点云可视化

PCL中pcl_visualization库中提供了可视化相关的数据结构和组件,其主要是为了可视化其他模块算法处理后的结果,可直观的反馈给用户。其依赖于pcl_common、pcl_range_image、pcl_kdtree、pcl_IO模块以及VTK外部开源可视化库。

1.简单可视化
pcl::visualization::CloudViewer viewer("Cloud Viewer");//创建viewer对象
viewer.showCloud(cloud);
2高级可视化
cloudViewer类本质上是PCLVisualizer类的简化封装,如需更多操作,则需要使用PCLVisualizer。
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include <pcl/visualization/pcl_visualizer.h>

typedef pcl::PointXYZ PointT;

int main()
{
	// 读取点云
	pcl::PointCloud<PointT>::Ptr cloud1(new pcl::PointCloud<PointT>);
	pcl::io::loadPCDFile("0010.pcd", *cloud1);

	pcl::PointCloud<PointT>::Ptr cloud2(new pcl::PointCloud<PointT>);
	pcl::io::loadPCDFile("0020.pcd", *cloud2);

	// 定义对象
	pcl::visualization::PCLVisualizer viewer; 
	//设置背景颜色,默认黑色
	//viewer.setBackgroundColor(100, 100, 100); // rgb

	// --- 显示点云数据 ----
	// "cloud1" 为显示id,默认cloud,显示多个点云时用默认会报警告。
	pcl::visualization::PointCloudColorHandlerCustom<PointT> green(cloud2, 0, 255, 0); // rgb
	viewer.addPointCloud(cloud1, green, "cloud1"); 

	pcl::visualization::PointCloudColorHandlerCustom<PointT> red(cloud2, 255, 0, 0); // rgb
	// 将点云设置颜色,默认白色
	viewer.addPointCloud(cloud2, red, "cloud2");

	// 将两个点连线
	PointT temp1 = cloud1->points[0];
	PointT temp2 = cloud1->points[1000];
	//viewer.addLine(temp1, temp2, "line0"); 
	// 同样可以设置线的颜色,蓝色
	viewer.addLine(temp1, temp2, 0, 0, 255, "line0");

	// --- 显示网格数据 ---
	pcl::PolygonMesh mesh;
	pcl::io::loadPLYFile("read.ply", mesh);

	viewer.addPolygonMesh(mesh);


	// 开始显示2种方法,任选其一
	// 1. 阻塞式
	viewer.spin();

	// 2. 非阻塞式
	while (!viewer.wasStopped())
	{
		viewer.spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
		// 可添加其他操作
	}

	system("pause");
	return 0;
}

多窗口点云可视化显示

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("ShowCloud"));
	viewer->setWindowName("点云导向滤波");//窗口名称
	int v1(0);
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);//窗口大小
	viewer->setBackgroundColor(0, 0, 0, v1);
	viewer->addText("Raw point clouds", 10, 10, "v1_text", v1);
	int v2(0);
	viewer->createViewPort(0.5, 0.0, 1, 1.0, v2);
	viewer->setBackgroundColor(0.1, 0.1, 0.1, v2);
	viewer->addText("filtered point clouds", 10, 10, "v2_text", v2);
	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> Color(cloud, "z");
	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> FilterColor(cloudOut, "z");
	viewer->addPointCloud<pcl::PointXYZ>(cloud, Color, "sample cloud", v1);
	viewer->addPointCloud<pcl::PointXYZ>(cloudOut, FilterColor, "cloud_filtered", v2);

	//view->addCoordinateSystem(1.0);
	//view->initCameraParameters();
	
	while (!viewer->wasStopped())//阻塞式
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;
}

阻塞式修正:
#include <boost/thread/thread.hpp>

while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));//因为用的pcl1.12.1推测之前的数值出现问题以及头文件吧不对
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值