|
1、原理介绍 由EdelsbrunnerH提出的alphashapes算法是一种简单、有效的快速提取边界点算法。如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动,其滚动的轨迹形成的点为轮廓点。需要注意的是,alphashapes算法只能探测二维点的轮廓点。因此在提取点云轮廓点直线,需要将点投影在二维平面上,一般是XOY平面,此时将所有点的z坐标均设置成相同的常数即可,如z=0。 2、部分代码解析 基于python的alphashapes算法进行边缘检测,其涉及到2个库,可视化库matplotlib,搜索近邻点库scipy。测试可视化结果包括原始点云可视化、边缘提取结果可视化、边缘点与原始点云可视化、滚动圆可视化四部分。 基于python编写的源代码下载链接:https://download.csdn.net/download/qq_32867925/89431667 文件包括程序脚本alphashapes提取边缘.py以及3个测试数据,如下图所示。 将py文件直接在pycharm中打开,并点击绿色三角进行运行即可,如下图所示。2.1点云读取 在测试时,利用列表结构将文本点云数据进行存储,如下:withopen('E:\\圆形.txt','r')asfile:#初始化一个列表来存储所有的点points2D=[]points3D=[]#逐行读取数据forlineinfile:#去除行尾的换行符并分割字符串x,y,z=line.strip().split(',')#将字符串转换为浮点数x=float(x)y=float(y)z=float(z)#将点添加到列表中points2D.append((x,y))2.2判断点是否为边缘点 判断一个点是否为边缘点,即所有点到计算的两个圆距离,若均大于半径,则为边缘点,否则为非边缘点。不分代码如下:ifcount==len(nearpts)-1:#全部属于某一个圆bounpts.append((x,y))circle_XY.append((x2,y2))breakelifcount01==len(nearpts)-1:#全部属于某一个圆bounpts.append((x,y))circle_XY.append((x21,y21))break3、结果测试 源代码基于python编写,在pycharm平台上运行,下载链接如下:https://download.csdn.net/download/qq_32867925/89431667?spm=1001.2014.3001.55033.1无孔洞点云 如下图为一圆形形状点云边缘点提取结果,可以发现提取的边缘点比较理想,边缘点都被准确提取出。同时,滚动圆位于边缘点,符合算法原理,即滚动圆绕圆进行滚动,滚动轨迹即为边缘点。原始点云可视化边缘点可视化边缘点与原始点云可视化滚动圆提取边缘点可视化 3.2有孔洞点云 有些特殊形状的点云,如包含内部孔洞,alphashapes仍可以准确提取出来,且效果不错,如下图所示,滚动圆在内部进行滚动,提取出轮廓边缘点,效果理想,说明程序运行正确。原始点云可视化边缘点可视化边缘点与原始点云可视化滚动圆提取边缘点可视化3.3滚动圆半径对结果影响 如下图所示,展示了不同滚动圆半径对提取结果的影响,其中左边图轮廓点,与右边滚动圆相对应。滚动圆半径radius为0.01提取结果:滚动圆半径radius为0.015提取结果:滚动圆半径radius为0.025提取结果: 可知,radius设置越大,提取的边缘点越少,这是由于凹拐角处的边缘点,会被漏提取导致。4、总结 介绍了基于python语言,根据alphashapes算法提取轮廓点,并使用图像对原理进行展示。
|
|