通常我们要确定某个规则物体,可以提取相应的几何特征,例如一个球只需提取出球心坐标和半径大小即可唯一确定该球。本次建模对象主要是某大学主楼,每次处理的对象是主楼的一部分,且每一部分可以近似看作矩形。最后将已处理的部分同时用pcd_viewer_release.exe工具显示,并将处理后的结果与主楼原始点云显示结果进行对比,看处理结果是否合理。
1. 将原始点云进行平面分割,得到若干个平面点云。【平面分割】
2. 对第一步中分割得到的平面进行聚类,聚类准则是若两个平面近似平行且相距较近,则将这两类聚为一类。【聚类】
3. 遍历得到每个类别,将每个类别中的所有平面投影到其中一个平面中。【投影】
4. 遍历投影后的结果平面,获取矩形平面的四个顶点。【获取矩形顶点】
5. 对获取到的矩形平面进行修剪。【修剪】
以上五步即为建模的算法流程。下面分别详细描述每一步:
这里分割直接采用PCL提供的随即采样一致性分割算法SACSegmentation,分割时需要提供一个距离阈值,该值不宜太小也不宜太大,倘若太小就造成过度分割,太大会造成分割比较粗糙。这里经过实验,该阈值设为0.06效果较好。
分割后就得到若干个点云平面和对应的平面方程系数。
遍历第一步分割出来的平面,每次对两个不同的平面进行比较,如果这两个平面近似平行,则计算这两个”平行”平面间的”距离”,若得到的距离小于设定的阈值,那么就将这两个平面聚为一类。
其中,判断两个平面是否近似平行,有两种可行办法。其中一种是计算两个平面单位法向量间的欧式距离,如果该距离接近于0,则表示平面近似平行;另外一种是计算两个平面单位法向量间的余弦距离,如果该距离对应的角度小于某个阈值,则表示两个平面近似平行。本次实验采用第二种,阈值设为12.5度。
两个”平行”平面间的”距离”的计算是采用K近邻算法,遍历其中一个平面的点,对平面的点到另一个平面的距离进行加权平均,每个点对应的权值是该点周围半径为R的圆内点的个数。
将聚类步骤中得到的近似平行的平面族投影到其中一个平面上,该基准平面的选取标准有两种,其中一种是点的个数最多的平面,另一种是最接近于垂直于地面的平面。本次实验比较两种效果后,决定采用第二种。当然选用第二个标准的前提是建筑物垂直于水平地面。
获取矩形顶点即为获取平面的最小边界盒,这里假设矩形的上面两个顶点构成的边平行于水平地面。这里首先获取Z值最大的点(最高的点)和最小的Z值(最低的点),然后获取两侧最远的点,通过这两个点和最高点就可以确定边界盒矩形。
最初得到的各个平面矩形有可能是相交的,这样就造成角落出现突出的部分,因此有必要对这些突出部分进行修剪。
修剪算法就是每次分别对一个矩形平面的上下两条边和一个点云平面进行处理,如果边与点云平面直接相交且其中一个端点到点云平面的距离小于某个阈值,那么将该端点用交点替换;如果边的延长线与点云平面相交且其中一个端点到点云平面的距离小于某个阈值,仍然将距点云平面近的点用交点替换。在本次试验中,阈值设置为1.8。
经过上面几步处理后就可以得到一些”矩形”,我们想要知道处理后的结果如何,就必须通过这些”矩形”重新画出建筑物的点云模型。
下面先给出原始建筑物点云的显示:
经过以上几步处理的的结果显示为:
而实物图为:
主楼前的圆柱形的门柱处理效果很不好就没有在上面的途中显示。
以上处理对应的代码见https://code.csdn.net/lming_08/segment_plane_implicit/tree/master
原文:http://blog.csdn.net/lming_08/article/details/23201709