Halcon 3D表面平面度和缺陷检测-平面矫正法

//平面度检测,平面差值法
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 <span class="token punctuation">(</span>RegionUnion<span class="token punctuation">,</span> Weld2holeRegion<span class="token punctuation">,</span> RegionUnion<span class="token punctuation">)</span>
    

    endfor

    gen_contour_region_xld (RegionUnion, Contours, ‘border’)
    dev_display (ImageReduced1)
    dev_display (Contours)
    *

      显示出模拟的缺陷区域
      在这里插入图片描述
      由于受到模拟缺陷的影响,实际拟合的角度有比较大的偏差值。
      在这里插入图片描述
      当剔除缺陷区域后,我们可以发现平面方程的XYZ数值已经非常接近水平面的平面方程了。所以在实际情况中,并不会有过多的影响
      在这里插入图片描述

      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 <span class="token punctuation">(</span>RegionUnion<span class="token punctuation">,</span> Weld2holeRegion<span class="token punctuation">,</span> RegionUnion<span class="token punctuation">)</span>
          

          endfor

          gen_contour_region_xld (RegionUnion, Contours, ‘border’)
          dev_display (ImageReduced1)
          dev_display (Contours)
          *

            总结

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

            转载自:https://blog.csdn.net/m0_51559565/article/details/137163729
            Hi~ 可私信我了解后再进行下载~ 本资源上传时,遗漏了两个文件,分别是:data_filter_keep_order_output_index.hdvp 以及 IntensityImageToPiontsCloudImage.hdvp,购买了该资源的同学,给我留言,我会私信发给你们。 1.基于halcon算法平台; 2.提供深图源文件以及解压密码; 3.代码预览: */****************************** * @文档名称: 基于点云的平面测量。 * @作者: hugo * @版本: 1.1 * @日期: 2021-6-20 * @描述: 该方法支持点云的平面平面测量。 ********************************/ dev_update_window ('on') dev_get_window (WindowHandle) read_image (imageReal, './replay_38893_2021-6-7.tif') xResolution:=0.06 yResolution:=0.06 zResolution:=0.001 ScaleFactor:=[xResolution,yResolution,zResolution] *采样区域1 create_drawing_object_rectangle2 (300, 120, rad(90), 30, 20, DrawID) set_drawing_object_params (DrawID, 'color', 'forest green') set_drawing_object_params (DrawID, 'line_width', 1) attach_drawing_object_to_window (WindowHandle, DrawID) .......... *平面 height:=theta/zScale*0.001 *可视化高差效果 visParamName := ['lut','alpha_0','intensity','color_1'] visParamValue := ['hsi',0.7,'coord_z','yellow'] Labels := ['','平面:'+height+'mm',''] objs:=[ObjectModel3Ds[2],final_ObjectModel3Ds] visualize_object_model_3d (WindowHandle, objs, [], [], visParamName, visParamValue, 'Edited by AmazingRobot+', [Labels], '', PoseOut) *stop () clear_object_model_3d (plane_balls) for Index := 0 to |final_ObjectModel3Ds|-1 by 1 clear_object_model_3d (final_ObjectModel3Ds[Index]) endfor return () 谢谢您的信任~
            评论
            添加红包

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

            当前余额3.43前往充值 >
            需支付:10.00
            成就一亿技术人!
            领取后你会自动成为博主和红包主的粉丝 规则
            hope_wisdom
            发出的红包
            实付
            使用余额支付
            点击重新获取
            扫码支付
            钱包余额 0

            抵扣说明:

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

            余额充值