PCL 有序点云和无序点云(Common_IO)

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,得到的点云不是真正有序的点云。

<think>好的,我现在需要帮助用户了解PCL中如何处理有序点云。首先,我得明确什么是有序点云。根据引用[3],有序点云的HEIGHT字段不为1,数据按行列排列,类似于图像,可以通过行列索引访问,比如cloud.at(column, row)。这引用[2]提到的不同,直接设置widthheight并不会创建真正的有序点云,可能只是改变元数据,而实际数据还是无序的。 接下来,用户想知道处理有序点云的方法使用教程。根据已有的引用,我需要整理相关处理方法。首先,访问方式很重要。有序点云可以像图像一样处理,比如使用at方法,但需要注意行列顺序是列在前,行在后,这图像处理相反。这可能是一个容易出错的地方,需要强调。 然后,引用[4]提到中值滤波的应用,这说明有序点云适合使用图像处理中的滤波技术。中值滤波的步骤可能包括定义滤波器、设置窗口大小、处理边缘等,这些步骤需要详细说明。此外,可能还有其他滤波方法或处理技术适用于有序点云,比如形态学操作或特征提取,但现有引用中没有提到,可能需要依赖其他知识或假设。 另外,引用[3]还提到验证有序点云的访问方式,可能需要代码示例来展示如何正确读取点云数据,并检查其有序性。这部分需要结合代码示例,比如加载PCD文件后,检查height是否为1,再通过at方法访问特定位置的点。 用户可能还需要知道如何处理从LAS文件获取的有序点云,但引用[1]主要涉及LAS文件的属性提取,如坐标、强度等,可能有序性处理关系不大,但可以提醒用户在处理LAS数据时注意点云是否有序。 需要注意的问题:有序点云的处理与无序点云有何不同?比如在滤波、配准、特征估计等方面是否可以利用其结构信息提高效率或效果。例如,中值滤波在有序点云中可以更高效地实现,因为相邻点有明确的位置关系。 可能还需要提到如何将无序点云转换为有序点云,但引用[2]指出直接设置widthheight不够,可能需要特定的方法或数据排列,但具体方法没有说明,可能需要进一步研究或提示用户参考其他资料。 总结处理有序点云的步骤可能包括:1. 确认点云的有序性(检查height);2. 正确的数据访问方式(at方法行列顺序);3. 应用适合有序结构的处理算法(如中值滤波);4. 注意与图像处理的差异(行列顺序)。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何判断点云是否有序,处理时的常见错误,其他适用的算法等。</think>### PCL有序点云处理方法详解 #### 一、有序点云的特性 有序点云数据结构类似于二维图像,其组织形式满足: - `height`字段值大于1,例如从深度相机或激光雷达扫描线获取的数据[^3] - 支持通过行列索引直接访问:`cloud.at(column, row)`,其中列索引在前、行索引在后(与图像坐标系相反) - 隐式包含空间邻域关系,适用于基于局部邻域的操作 #### 二、核心处理方法 1. **数据访问验证** ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("input.pcd", *cloud); if(cloud->height > 1) { pcl::PointXYZ pt = cloud->at(col, row); // 列优先访问 std::cout << "点(" << col << "," << row << ")坐标: " << pt.x << ", " << pt.y << ", " << pt.z << std::endl; } ``` 2. **中值滤波实现** 基于邻域窗口的噪声过滤算法,窗口尺寸通常设为3×3或5×5: $$ \text{FilteredValue} = \text{median}(N(x,y)) $$ 其中$N(x,y)$表示点$(x,y)$的邻域集合[^4] ```cpp pcl::MedianFilter<pcl::PointXYZ> filter; filter.setInputCloud(cloud); filter.setWindowSize(3); // 3x3窗口 filter.filter(*filtered_cloud); ``` 3. **邻域特征计算** 利用有序结构加速法向量估计: ```cpp pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setNormalEstimationMethod(ne.AVERAGE_3D_GRADIENT); ne.setInputCloud(cloud); ne.compute(*normals); ``` #### 三、处理注意事项 1. **有序性验证** 需同时检查`width*height == size`条件,防止伪有序点云[^2] 2. **坐标系转换** 进行图像式处理时需注意行列顺序与笛卡尔坐标系的对应关系 3. **数据边界处理** 滤波操作需要特殊处理图像边缘点(如镜像填充或截断处理) #### 四、典型应用场景 1. 深度图像处理(Kinect/ToF相机数据) 2. 激光雷达扫描线数据分析 3. 基于点云结构的图像式特征提取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值