PCL专栏目录及须知-优快云博客
1.原理
点云分为有序和无序两种。
(1)有序点云
刚刚通过激光雷达扫出来的点云一般都是有序点云。
有序点云往往以:规则的网格或栅格形式表示,其中点的排列遵循某种规则,例如下图所示的点云,从上而下,一排一排的排列。
其中包含的拓扑信息和结构信息,有助于计算。
有序点云不能随意修改点云点在点云中的存储位置。
有序点云在PCL中表现为,读取之后的点云:cloud->height ≠ 1。
如下图:
下图1点云,对XYZ三个方向分别由大到小排序,让它点云点的存储规则变成图2形式。
这即是有序点云的一种(规则不一定和我画的一样,按情况而定[一般都是空间位置],但有序点云一定是按照某种规则存储的)。
(图1)
(图2)
(2)无序点云
一般用来做后处理的点云都是无序点云。
它没有拓扑信息和结构信息。
无序点云是随意存储的,没有存储规则,可以随意修改点云点之间的顺序,不会对点云造成什么影响。
无序点云在PCL中表现为,读取之后的点云:cloud->height = 1。
2.判断
结果为true时为有序点云,结果为false时为无序点云。
cloud->isOrganized()
3.转换
(1)有序点云转无序点云
有序转无序很简单,但没有意义。
使用以下代码,将有序点云读取保存为cloud->wight = 原点云->size()、cloud->height = 1的新点云中,即完成有序转无序。
代码:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/integral_image_normal.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
/****************无序点云与有序点云互转********************/
// 原始点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/plane.pcd", *cloud_in); // 加载原始点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out_O2D(new pcl::PointCloud<pcl::PointXYZ>); // 无序
// 有序点云转无序点云
cloud_out_O2D->width = cloud_in->size(); // 无序点云width为其点云数,height=1
cloud_out_O2D->height = 1;
cloud_out_O2D->resize(cloud_out_O2D->width * cloud_out_O2D->height);
for (size_t i = 0; i < cloud_out_O2D->size(); ++i)
{
cloud_out_O2D->points[i].x = cloud_in->points[i].x;
cloud_out_O2D->points[i].y = cloud_in->points[i].y;
cloud_out_O2D->points[i].z = cloud_in->points[i].z;
}
}
(2)无序转有序
无序转有序。
思路:
1)首先对点云按照你想要的规则进行点云标注。
2)按照标注的点云,进行用户自定义规则下的读取,读取保存成为有序点云。
4.注意事项
直接给PCL的cloud设置一个cloud->width = 整数A,cloud->height = 整数B,得到的点云不是真正有序的点云。