对于三维测量的套路,都是将图像转成二维进行测量和处理
我仍然以这个开关检测项目为例,开关点云有x,y,z,三个空间坐标
如果对这个三维点云直接处理,有一个思路我提供给大家,将点云模型完全调平,然后针对x,y,z其中一个坐标进行测量,其实这种思路也是将三维图转为平面。
一.点云图转深度图+点云滤波
本篇着重讲解如何将点云模型转为深度图的思路。
1.将点云模型拆分成x,y,z三个数组,这里的数据可以自动清空,具体请补充一下数据存储,堆和栈的内容。
2.这里提出一个手法,将点云数据拆分成三个数组之后,有很多点事有小数位的,这里为了提高精度,会把数组中的坐标乘以10或100,视情况而定,如此图像的细节会更加清晰,可以理解为拉伸图像。
3.之后观察调平的点云,以x,y为Row和Column,z为灰度值,建立深度图。此时可以将图像当成二维图像处理。
4.细心地朋友可能会发现,这个生成的深度图是有孔洞的。这与物料的反光或者遮挡有关,如下是缺失点云数据的点云模型。
如下是缺失点的深度图
5.刚说到,可以对深度图运用二维的处理,这里分别运用中值滤波,高斯滤波,均值滤波对图像进行处理,填充孔洞。
二.断线拟合
这里讲的是二维的处理手法
有时候直接调用提取边缘的算子呢,提取出的边缘线存在断线,或交叉线,对于边缘拟合造成了很大的麻烦,这里点出断线拟合的思路。
1.将线段打散成点
2.对点基于行或列排序注意这里排序很重要,不排序拟合直线时会出现交叉点
排序后效果图
3.拟合线
edges_sub_pix (ImageReduced1, Edges1, 'canny', 1,5, 25) count_obj (Edges1, Number1) for Idle:=1 to Number1 by 1 select_obj (Edges1, EdgeContour, Idle) *把线变为点 get_contour_xld(EdgeContour, RowS,ColumnS) Row1:=[Row1,RowS] Column1:=[Column1,ColumnS] endfor tuple_sort_index (Row1, Indices) tuple_length(Row1,Length) NewRow:=[] NewColumn:=[] if(Length>=1) *方法1 NewRow:=subset(Row1,Indices) NewColumn:=subset(Column1,Indices)
转载自:
https://blog.csdn.net/weixin_41405284/article/details/107556168

