Halcon视觉-刀具检测-形态学[email protected]龙熙视觉

Halcon视觉-刀具检测-形态学[email protected]龙熙视觉

原图Halcon视觉-刀具检测-形态学[email protected]龙熙视觉
结果
halcon代码

  • 8打开文件,读取图片
      dev_open_file_dialog (‘read_image’, ‘default’, ‘default’, Selection)
      read_image (Image, Selection)
     
     
      * 阈值分割,求出刀具区域
      threshold (Image, Regions, 0, 59)
      difference (Image, Regions, RegionDifference)
      connection (RegionDifference, ConnectedRegions)
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 397623, 1e+006)
      shape_trans (SelectedRegions, RegionTrans, ‘convex’)
      reduce_domain (Image, RegionTrans, ImageReduced)
     
      * 求突出的孔过程*************************
      * 孔洞出现在边缘,求其边缘
      get_domain (ImageReduced, Domain)
      erosion_circle (Domain, RegionErosion, 80)
      difference (Domain, RegionErosion, RegionDifference1)
      reduce_domain (ImageReduced, RegionDifference1, ImageReduced1)
     
      * 动态阈值求边缘区域(空洞出现在边缘环形区域内)
      mean_image (ImageReduced1, ImageMean, 10, 10)
      dyn_threshold (ImageReduced1, ImageMean, RegionDynThresh, 3, ‘light’)
      * 填充小的洞
      fill_up_shape (RegionDynThresh, RegionDynThresh, ‘area’, 1, 300)
      connection (RegionDynThresh, ConnectedRegions1)
      * 根据面积第一次选择
      select_shape (ConnectedRegions1, SelectedRegions1, ‘area’, ‘and’, 500, 1000)
      shape_trans (SelectedRegions1, RegionTrans1, ‘convex’)
      count_obj (RegionTrans1, Number)
     
      * 根据圆度Circularity第二次选择,孔洞部分圆度大
      gen_empty_obj (DefectHole)
      for Index := 1 to Number by 1
          select_obj (RegionTrans1, ObjectSelected, Index)
          circularity (ObjectSelected, Circularity)
          if (Circularity>0.52)
              select_obj (SelectedRegions1, ObjectSelected2, Index)
              opening_circle (ObjectSelected, RegionOpening, 3.5)
              concat_obj (DefectHole, RegionOpening, DefectHole)
          endif
      endfor
     
      connection (DefectHole, ConnectedRegions2)
      count_obj (ConnectedRegions2, Number1)
     
      * 上面求出的空洞面积不是很准,进行修改阈值第二次提取
      gen_empty_obj (DefectHoleLast)
      * 精确检测孔面积
      for Index1 := 1 to Number1 by 1
          select_obj (ConnectedRegions2, ObjectSelected1, Index1)
          area_center (ObjectSelected1, Area, Row, Column)
          gen_circle (Circle, Row, Column, 25)
          reduce_domain (Image, Circle, ImageReduced2)
          mean_image (ImageReduced2, ImageMean1, 20, 20)
          dyn_threshold (ImageReduced2, ImageMean1, RegionDynThresh1, 10, ‘dark’)
          connection (RegionDynThresh1, ConnectedRegions3)
          select_shape (ConnectedRegions3, SelectedRegions2, ‘area’, ‘and’, 150, 500)
          shape_trans (SelectedRegions2, RegionTrans2, ‘outer_circle’)
          concat_obj (DefectHoleLast, RegionTrans2, DefectHoleLast)
      endfor
     
      connection (DefectHoleLast, ConnectedRegions4)
      count_obj (ConnectedRegions4, Number2)
     
     
      * 求凹进去的孔洞过程************
      * 孔与洞特征不同,检测为孔再检测洞
      * 去掉已经检测出的突起孔洞
      difference (RegionDifference1, ConnectedRegions4, RegionDifference1)
     
      reduce_domain (ImageReduced, RegionDifference1, ImageReduced1)
     
      mean_image (ImageReduced1, ImageMean, 10, 10)
      dyn_threshold (ImageReduced1, ImageMean, RegionDynThresh1, 5, ‘light’)
      connection (RegionDynThresh1, ConnectedRegions6)
      select_shape (ConnectedRegions6, SelectedRegions3, ‘area’, ‘and’, 100, 400)
      fill_up (SelectedRegions3, RegionFillUp)
      select_shape (RegionFillUp, SelectedRegions5, ‘area’, ‘and’, 200, 300)
      shape_trans (SelectedRegions5, RegionTrans3, ‘convex’)
     
      * 根据面积、圆度进行选择(第一次筛选)
      select_shape (RegionTrans3, SelectedRegions4, [‘area’,‘circularity’], ‘and’, [210,0.5], [350,1])
     
      connection (SelectedRegions4, ConnectedRegions5)
      count_obj (ConnectedRegions5, Number3)
     
      gen_empty_obj (DefectDong)
     
      * 上述区域收缩80,该处收缩79,变大1,如果区域与变大1后的区域有交集,则将其过滤
      * 主要是为了减去边缘区域的凸起进行干扰
      erosion_circle (Domain, RegionErosion, 79)
      for Index2 := 1 to Number3 by 1
          select_obj (SelectedRegions4, ObjectSelected3, Index2)
          intersection (RegionErosion, ObjectSelected3, RegionIntersection)
          area_center (RegionIntersection, Area1, Row1, Column1)
     
          * 如果没有交集,也就是交集面积为非0,则将其过滤掉,如果是0则保留
          if (Area1==0)
              concat_obj (DefectDong, ObjectSelected3, DefectDong)
          endif
      endfor
     
      connection (DefectDong, ConnectedRegions7)
      count_obj (ConnectedRegions7, Number4)
     
      * 精确检测凹进去的区域
      gen_empty_obj (DefectDongLast)
      for Index2 := 1 to Number4 by 1
          select_obj (ConnectedRegions7, ObjectSelected1, Index1)
          area_center (ObjectSelected1, Area, Row, Column)
          gen_circle (Circle, Row, Column, 25)
          reduce_domain (Image, Circle, ImageReduced5)
     
          * 动态阈值求出区域
          mean_image (ImageReduced5, ImageMean1, 20, 20)
          dyn_threshold (ImageReduced5, ImageMean1, RegionDynThresh1, 10, ‘dark’)
          connection (RegionDynThresh1, ConnectedRegions3)
     
          * 根据形状面积筛选
          select_shape (ConnectedRegions3, SelectedRegions2, ‘area’, ‘and’, 150, 500)
     
          * 将其进行凸性转化
          shape_trans (SelectedRegions2, RegionTrans2, ‘outer_circle’)
          concat_obj (DefectDongLast, RegionTrans2, DefectDongLast)
      endfor
      get_image_size (Image, Width, Height)
      dev_open_window (0, 0, Width/2, Height/2, ‘black’, WindowHandle)
      dev_clear_window ()
      dev_display (Image)
      dev_display (DefectHoleLast)
      dev_display (DefectDongLast)
     
      disp_message (WindowHandle, ‘共检测出孔’+Number2+‘个’, ‘window’, 12, 12, ‘black’, ‘true’)
      disp_message (WindowHandle, ‘共检测出洞’+Number4+‘个’, ‘window’, 50, 12, ‘black’, ‘true’)

相关文章:

  • 2022-01-01
  • 2021-09-08
  • 2021-10-13
  • 2021-12-01
  • 2021-11-01
  • 2022-12-23
  • 2021-11-01
猜你喜欢
  • 2021-11-27
  • 2021-08-19
  • 2021-08-05
  • 2021-06-14
  • 2021-12-12
  • 2021-05-15
  • 2021-12-19
相关资源
相似解决方案