隧道点云处理(一):投影边界提取 (Alpha Shapes)

本文介绍了Alpha Shapes算法在点云处理中的应用,特别是用于隧道点云的边界提取。该算法通过调整半径α,确定点集的边界线段。在点密度均匀的情况下,适当选择α值可提取内外边界。文章详细阐述了算法原理,包括判断条件和步骤,并展示了代码实现及结果。
摘要由CSDN通过智能技术生成

1 算法溯源

Alpha Shapes算法 最早由 Edelsbrunner [ 1 ] ^{[1]} [1](1983) 提出。沈蔚 [ 2 , 3 ] ^{[2,3]} [2,3](2008)首次将该算法应用于LIDAR数据处理(建筑物轮廓提取),并证明了该算法是一种简单高效、稳定的边界点提取算法。

图1 所示,用一个半径为 α \alpha α 的圆在点集 P 外滚动,当 α \alpha α 足够大时,这个圆就不会滚到点集内部,其滚动的痕迹就是点集 P 的边界线。故理论上存在:

  • α \alpha α 值足够小,趋向于 0 0 0 时,点集 P 中的每一个点都是边界点;
  • 如果 α \alpha α 值足够大,趋向于无穷时,Alpha Shapes( α → ∞ \alpha → ∞ α) 是点集 P 的凸包。当 P 中点密度比较均匀,且 α \alpha α 取适当的值时,Alpha Shapes 可同时提取点集 P 的内外边界。

在这里插入图片描述

图 1 Alpha Shapes 边界提取示意图

2 算法原理

2.1 判断条件

对于有限点集 P,由 n 个点组成,那么这 n 个点可以构成 n × ( n − 1 ) n × (n - 1) n×(n1) 条有向线段。我们的任务判断哪些线段为边界线段。

Alpha Shapes 模型的判断条件:

在点集 P 内,过任意两点 p 1 p_1 p1 p 2 p_2 p2 绘制半径为 α \alpha α 的圆,如果这个圆内没有其他点,则认为 p 1 p_1 p1 p 2 p_2 p2 为边界点,其连线 p 1 p 2 p_1p_2 p1p2 为边界线段。

图 2 所示,已知点 p 1 ( x 1 , y 1 ) p_1(x_1, y_1) p1(x1,y1) p 2 ( x 2 , y 2 ) p_2(x_2,y_2) p2(x2,y2),求过这两点圆的圆心 p 3 ( x 3 , y 3 ) p_3(x_3,y_3) p3(x3,y3),可由 后方距离交会法 求得。
{ x 3 = x 1 + 1 2 ( x 2 − x 1 ) + H ( y 2 − y 1 ) y 3 = y 1 + 1 2 ( y 2 − y 1 ) + H ( x 1 − x 2 ) \begin{cases} x_3=x_1+\cfrac{1}{2}(x_2-x_1)+H(y_2-y_1)\\ y_3=y_1+\cfrac{1}{2}(y_2-y_1)+H(x_1-x_2)\\ \end{cases} x3=x1+21(x2x1)+H(y2y1)y3=y1+21(y2y1)+H(x1x2)
其中, H = α 2 ( x 1 − x 2 ) 2 − ( y 1 − y 2 ) 2 − 1 4 H=\sqrt {\cfrac{\alpha^2}{(x_1-x_2)^2-(y_1-y_2)^2}-\cfrac 1 4} H=(x1x2)2(y1y2)2α241
在这里插入图片描述

图 2 距离交会法求圆心

获得圆心后,通过判断其他点到圆心的距离与半径 α \alpha α 的关系即可判断圆内是否存在其他点。

2.2 算法步骤

(1)从点集 P 中任意点 p i p_i pi 开始,在半径为 2 α 2\alpha 2α 的邻域点集 R 内,取任意点 p r p_{r} pr,计算由点 p i p_i pi 与 点 p r p_{r} pr 确定的圆心 p 0 p_{0} p0
(2)计算邻域内其他点到圆心 p 0 p_{0} p0 的距离 d i d_i di。若所有 d i d_i di 均大于 α \alpha α ,说明圆内没有其他点,则 p i p r p_ip_{r} pipr 为边界线段;否则为非边界线段;
(3)对邻域点集 R 中的剩余点重复前两步,直到 R 内的点全部判断完成;
(4)对点集 P 中的剩余点重复上述步骤,直到 P 中的点全部判断完成。

在这里插入图片描述

图 3 边界点判断示意图

在这里插入图片描述

图 4 边界点提取结果示意图

3 代码实现

步骤: 读取隧道点云→水平投影→投影下采样→边界点提取→保存边界点

由于水平投影后,边界点密度要大于内部点密度,因此要进行下采样,使投影点均匀分布

代码:

#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/console/time.h>

using namespace std;

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;

int main()
{
	//----------------------------- 加载点云 ----------------------------
	cout << "->正在加载点云..." << endl;
	PointCloudT::Ptr cloud(new PointCloudT);
	if (pcl::io::loadPCDFile("test.pcd", *cloud) < 0)
	{
		PCL_ERROR("->点云文件不存在!\a\n");
		return -1;
	}
	cout << "->共加载 " << cloud->points.size() << " 个数据点" << endl;
	//==================================================================


	//----------------------------- 点云投影 ----------------------------
	cout << "->正在水平面投影..." << endl;
	for (size_t i = 0; i < cloud->size(); ++i)
	{
		cloud->points[i].z = -1.0f;
	}
	//==================================================================

	//-------------------------- 投影边界下采样 --------------------------
	PointCloudT::Ptr cloud_sub(new PointCloudT);	//投影下采样点云
	pcl::VoxelGrid<PointT> vg;			//创建体素下采样对象
	vg.setInputCloud(cloud);			//设置下采样输入点云
	vg.setLeafSize(0.05f, 0.05f, 0.05f);//设置体素栅格边长
	vg.filter(*cloud_sub);				//执行体素下采样
	//==================================================================

	//-------------------- Alpha Shapes 提取投影边界 --------------------
	pcl::console::TicToc time;
	time.tic();
	cout << "->正在提取边界..." << endl;
	PointCloudT::Ptr cloud_boundary(new PointCloudT);
	pcl::ConcaveHull<PointT> ch;
	ch.setInputCloud(cloud_sub);
	ch.setAlpha(0.15);
	ch.reconstruct(*cloud_boundary);
	cout << "->边界点提取用时:" << time.toc() / 1000 << " s" << endl;
	//==================================================================


	//---------------------------- 保存边界点云 --------------------------
	cout << "->正在保存边界点云..." << endl;
	if (!cloud_boundary->empty())
	{
		pcl::io::savePCDFileBinary("Alpha_Shapes.pcd", *cloud_boundary);
		cout << "->共提取到 " << cloud_boundary->points.size() << " 个边界点" << endl;
	}
	else
	{
		PCL_ERROR("边界点云为空!\a\n");
		system("pause");
		return -1;
	}
	//==================================================================

	return 0;
}

输出结果:

->正在加载点云...
->共加载 744705 个数据点
->正在水平面投影...
->正在提取边界...
->边界点提取用时:9.63 s
->正在保存边界点云...
->共提取到 3782 个边界点

3 结果展示

隧道投影点云: 为便于展示,进行间隔为0.6m的空间距离下采样
在这里插入图片描述

边界点云:
在这里插入图片描述
L e a f S i z e LeafSize LeafSize 为体素下采样半径

投影点云 & 边界点云
在这里插入图片描述

4 半径 α \alpha α与边界提取结果的关系

α = k ⋅ L e a f S i z e \alpha = k·LeafSize α=kLeafSize边界点数耗时(s)结果展示
k=15809610.975在这里插入图片描述
k=1.540919.701在这里插入图片描述
k=239629.647在这里插入图片描述
k=337829.841在这里插入图片描述
k=436549.893在这里插入图片描述
k=633909.677在这里插入图片描述
k=831419.665在这里插入图片描述
k=1029459.732在这里插入图片描述

结论:

半径 α \alpha α 应大于体素下采样半径, k = 2 k = 2 k=2 时,提取效果较好。继续增大倍数,提取的边界点数越少,但变化不大,且提取效率基本相同。

5 参考文献

[1] on the shape of a set of points in the plane
[2] Building boundary extraction based on LIDAR point clouds data
[3] 沈蔚,李京,陈云浩,等.基于LIDAR数据的建筑轮廓线提取及规则化算法研究[J].遥感学报,2008(05):692-698.

### 回答1: PCL(Point Cloud Library)是一个用于点云数据处理的开源库,它提供了大量的算法和工具来处理点云数据。而PCL alpha shapes方法是PCL中的一种算法,用于提取平面点云边界特征。 平面点云是在三维空间中表示表面的点的集合。而平面点云边界特征是指该点云边界形状和结构。PCL alpha shapes方法基于alpha形状,能够自动从点云提取出平面点云边界特征。 alpha形状是指包围点云的一系列形状,其中每个形状都由一组alpha值确定。alpha值控制了形状的光滑程度,较大的alpha值会产生更平滑的形状,而较小的alpha值会产生更多边的形状。PCL alpha shapes方法会通过调整alpha值来生成一系列形状,并计算每个形状的体积。最终选择体积最大的形状作为平面点云边界特征。 使用PCL alpha shapes方法进行平面点云边界特征提取的步骤如下: 1. 从点云数据中提取出平面点云,例如通过使用平面拟合算法提取平面模型。 2. 根据提取到的平面点云,构建点云对象。 3. 初始化PCL alpha shapes方法的参数,例如设置alpha值的范围和步长。 4. 调用PCL alpha shapes方法,通过遍历不同的alpha值进行形状计算和体积计算。 5. 选择体积最大的形状作为平面点云边界特征。 6. 可以根据需要进一步处理和分析边界特征,例如提取边界点和边界曲线。 总的来说,PCL alpha shapes方法可以有效地提取平面点云边界特征,为后续的点云处理和分析提供基础。它可以应用于许多领域,例如三维建模、地形分析和机器人导航等。 ### 回答2: pcl alpha shapes是一种用于平面点云边界特征提取的方法。它基于alpha形状的概念,将点云分为内部和外部两部分。alpha形状是在点云中定义的一个凸体,具有不同的形状和大小。 首先,我们需要通过点云数据构建有向无环图(DAG)。这个DAG可以表示点云中的拓扑结构,每个节点代表一个点,节点之间的边代表点与点之间的邻近关系。然后,我们需要计算alpha值,它是一个介于0和无穷大之间的阈值。alpha值越小,形状越平滑;alpha值越大,形状越复杂。 然后,我们需要根据alpha值对DAG进行拓扑排序,并从最小的alpha开始处理。对于每个alpha,我们找到对应的alpha形状。我们通过从内部到外部构建alpha形状来获得点云边界特征。每当遇到重叠的alpha形状时,我们计算边界alpha形状,并将其添加到结果中。 在计算alpha形状时,我们使用增量算法来优化计算效率。通过添加和移除点来逐步构建alpha形状,直到满足alpha值的约束条件。对于每个点,我们计算其点球半径,并与alpha值进行比较。如果点球半径大于alpha值,则点将被舍弃,否则将被添加到alpha形状中。 通过这种方式,pcl alpha shapes可以提取平面点云边界特征。它能够识别点云边界结构,并返回一个表示点云边界的几何形状。这对于物体识别、三维建模和场景分析等应用非常有用。 ### 回答3: PCL Alpha Shapes 是一种用于平面点云边界特征提取算法。它的主要目标是从点云数据中提取曲面边界信息,通过计算点云中点的Alpha形状,来获得边界特征。 具体来说,Alpha形状是一个可以描述几何体边界的参数。Alpha形状的计算是基于一系列重心相邻三角形,其中每个三角形的边长都小于或等于Alpha值。当Alpha值很小时,Alpha形状就会更接近于一个紧凑的表面形状,而当Alpha值增大时,形状则会变得更加平滑。 使用PCL Alpha Shapes算法进行平面点云边界特征提取的步骤如下: 1. 通过某种方法从点云中移除噪声和离群点,以减小Alpha形状的计算误差。 2. 利用PCL库中的函数计算每个点的Alpha形状。 3. 根据Alpha形状的计算结果,可以获得不同形状的边界特征,例如:圆形、椭圆形等。 4. 可进一步根据需求,设置Alpha值的范围来控制边界形状的复杂度。 5. 最后,可以通过可视化工具将提取到的边界特征呈现出来,以便直观地观察和分析结果。 总而言之,通过使用PCL Alpha Shapes算法,可以快速而准确地提取平面点云中的边界特征,帮助我们更好地理解和分析点云数据的几何结构。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙 悟 空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值