爱炸薯条的小朋友

爱炸薯条的小朋友

//平面度检测,平面差值法
https://blog.csdn.net/m0_51559565/article/details/137148735
//倾斜平面矫正
https://blog.csdn.net/m0_51559565/article/details/137146179

前言

我的上一篇博客针对了对常见的平面度检测的方法——平面差值法做了简单的讲解。但是我也提到平面差值法有诸多的缺点,如无法定位异常位置,无法忽略噪点的影响等。
所以现在使用平面矫正法可以有效的避免上述情况

1.halcon程序

dev_get_window (WindowHandle)
*读取3通道彩色融合图
read_image (Image, 'D:/1NewWork/Halcon3D/XYZ彩色融合图.tiff')
get_image_size (Image, Width, Height)
*拆分3个通道
decompose3 (Image, x, y, z)
*3个通道图像转换为3D模型
xyz_to_object_model_3d (x,y, z, ObjectModel3D)

***********************************模拟有缺陷的平面************************
threshold (z, Regions, 107.77, 200)
*对二值化图像进行腐蚀,剔除产品边缘,通常使用5*当前模拟表面出现的凹陷情况
erosion_circle (Regions, RegionErosion, 50)
reduce_domain (z, RegionErosion, ImageReduced1)
*测量基准平面

**************************************************************************
**********************************通过测量面,对缺陷平面进行矫正*************
*显示动态3D模型
threshold (z, Regions, 113.24, 200)
erosion_circle (Regions, RegionErosion, 5)
reduce_domain (z, Regions, ImageReduced)
*获取灰阶平面
moments_gray_plane (Regions, ImageReduced, MRow, MCol, Alpha, Beta, Mean)
*创建平行于灰阶平面的面
gen_image_surface_first_order (ImageSurface1, 'real', Alpha, Beta, Mean, MRow, MCol, Width, Height)
*2个面相减得到矫正后的面
sub_image (ImageReduced1, ImageSurface1, ImageSub, 1, 0)

xyz_to_object_model_3d (x,y, ImageSub, ObjectModel3D)

fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,可用于验算
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane)

get_object_model_3d_params(ObjectModel3D9, 'point_coord_z', Z)
*求得平面高度
tuple_mean (Z, Mean1)
*由于平面矫正后,高度数据发生了镜像翻转,所以我们检测高于平面的高度,应该选取负值
*可以通过运行的公差带进行设定高度值
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', -300, Mean1-0.3, ObjectModel3DIDReduced)
*生成连通域
connection_object_model_3d (ObjectModel3DIDReduced, 'distance_3d', 0.3, ObjectModel3DConnected)
*选取点云个数在一定范围内的3D模型
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 100, 3000000000, ObjectModel3DSelected)
******************************************用于显示缺陷区域************************
gen_empty_region (RegionUnion)
tuple_length (ObjectModel3DSelected, Length)
for i := 0 to Length-1 by 1
    get_object_model_3d_params (ObjectModel3DSelected[i], 'mapping_row', Weld2holeRow)
    get_object_model_3d_params (ObjectModel3DSelected[i], 'mapping_col', Weld2holeCol)
    gen_region_points (Weld2holeRegion, Weld2holeRow, Weld2holeCol)
    
    union2 (RegionUnion, Weld2holeRegion, RegionUnion)
endfor

gen_contour_region_xld (RegionUnion, Contours, 'border')
dev_display (ImageReduced1)
dev_display (Contours)
***********************************************************************************

显示出模拟的缺陷区域
Halcon3D表面平面度和缺陷检测-平面矫正法-LMLPHP
由于受到模拟缺陷的影响,实际拟合的角度有比较大的偏差值。
Halcon3D表面平面度和缺陷检测-平面矫正法-LMLPHP
当剔除缺陷区域后,我们可以发现平面方程的XYZ数值已经非常接近水平面的平面方程了。所以在实际情况中,并不会有过多的影响
Halcon3D表面平面度和缺陷检测-平面矫正法-LMLPHP

2.halcon程序解析

2.1创建模拟缺陷平面

dev_get_window (WindowHandle)
*读取3通道彩色融合图
read_image (Image, 'D:/1NewWork/Halcon3D/XYZ彩色融合图.tiff')
get_image_size (Image, Width, Height)
*拆分3个通道
decompose3 (Image, x, y, z)
*3个通道图像转换为3D模型
xyz_to_object_model_3d (x,y, z, ObjectModel3D)

***********************************模拟有缺陷的平面************************
threshold (z, Regions, 107.77, 200)
*对二值化图像进行腐蚀,剔除产品边缘,通常使用5*当前模拟表面出现的凹陷情况
erosion_circle (Regions, RegionErosion, 50)
reduce_domain (z, RegionErosion, ImageReduced1)
*测量基准平面

读取图像,将托盘计算其中,创建一个带有缺陷的平面

2.2创建模拟缺陷平面

**********************************通过测量面,对缺陷平面进行矫正*************
*显示动态3D模型
threshold (z, Regions, 113.24, 200)
erosion_circle (Regions, RegionErosion, 5)
reduce_domain (z, Regions, ImageReduced)
*获取灰阶平面
moments_gray_plane (Regions, ImageReduced, MRow, MCol, Alpha, Beta, Mean)
*创建平行于灰阶平面的面
gen_image_surface_first_order (ImageSurface1, 'real', Alpha, Beta, Mean, MRow, MCol, Width, Height)
*2个面相减得到矫正后的面
sub_image (ImageReduced1, ImageSurface1, ImageSub, 1, 0)

xyz_to_object_model_3d (x,y, ImageSub, ObjectModel3D)

fit_primitives_object_model_3d(ObjectModel3D, ['primitive_type', 'fitting_algorithm'], ['plane', 'least_squares_tukey'], ObjectModel3D9)
*获取到平面参数,可用于验算
get_object_model_3d_params(ObjectModel3D9, 'primitive_parameter', plane)

通过测量面,对整个3D模型进行矫正。由于此次选取的缺陷过大,10mm,远大于测量要求。所以导致实际拟合的平面角度达到0.8度,但是我剔除缺陷后的矫正角度为近似0度。实际产品中的缺陷并不存在远大于测量要求的情况(并且面积过大)。所以矫正平面误差可以忽略不计。

2.3求取缺陷和缺陷位置,并生成XLD轮廓


get_object_model_3d_params(ObjectModel3D9, 'point_coord_z', Z)
*求得平面高度
tuple_mean (Z, Mean1)
*由于平面矫正后,高度数据发生了镜像翻转,所以我们检测高于平面的高度,应该选取负值
*可以通过运行的公差带进行设定高度值
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', -300, Mean1-0.3, ObjectModel3DIDReduced)
*生成连通域
connection_object_model_3d (ObjectModel3DIDReduced, 'distance_3d', 0.3, ObjectModel3DConnected)
*选取点云个数在一定范围内的3D模型
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 100, 3000000000, ObjectModel3DSelected)
******************************************用于显示缺陷区域************************
gen_empty_region (RegionUnion)
tuple_length (ObjectModel3DSelected, Length)
for i := 0 to Length-1 by 1
    get_object_model_3d_params (ObjectModel3DSelected[i], 'mapping_row', Weld2holeRow)
    get_object_model_3d_params (ObjectModel3DSelected[i], 'mapping_col', Weld2holeCol)
    gen_region_points (Weld2holeRegion, Weld2holeRow, Weld2holeCol)
    
    union2 (RegionUnion, Weld2holeRegion, RegionUnion)
endfor

gen_contour_region_xld (RegionUnion, Contours, 'border')
dev_display (ImageReduced1)
dev_display (Contours)
***********************************************************************************

总结

在文章开头,我写上了一篇使用平面差值法的平面度检测,他们互相的差距在于,平面差值法更简单,适用于条件良好的产品,或者无法进行平面矫正的产品。但是通常情况来说,使用平面矫正法是最为常见的表面度检测和平面缺陷检测。

03-31 09:45