Halcon缺陷检测——Blob分析特征

这篇博客介绍了三个使用Halcon进行图像分析的案例,包括检测破碎的小饼干、胶囊药粒的完整性以及塑料网破损情况。通过阈值处理、形态学操作和特征提取,对不同场景下物体的合格性进行判断,展示了Halcon在工业检测中的应用。
摘要由CSDN通过智能技术生成

案例1:检测破碎的小饼干

check_hazeInut_wafers.hdev

这个例子就是利用区域的孔洞面积和矩形度两个特征来判断被测物是否合格的,这种非此即彼,而且带有比较主观性的方法,一般要求光照稳定,背景简单。
在这里插入图片描述
在这里插入图片描述
Halcon代码:

dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (3)

list_files ('./', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)

for Index := 0 to |ImageFiles| - 1 by 1
       read_image (Image, ImageFiles[Index])
             
       threshold (Image, Regions, 56, 255)
       opening_circle (Regions, RegionOpening, 8.5)            
       region_features (RegionOpening, 'area_holes', AreaHole)
       region_features (RegionOpening, 'rectangularity', Rectangularity)
       
       dev_display (Image)
       if(AreaHole<300 and Rectangularity>0.92)
              dev_set_color ('green')
              dev_display (RegionOpening)
              set_display_font (WindowHandle, 96, 'mono', 'true', 'false')
              disp_message (WindowHandle, 'OK', 'image', 12, 12, 'green', 'false')
       else
              dev_set_color ('red')
              dev_display (RegionOpening)
              set_display_font (WindowHandle, 96, 'mono', 'true', 'false')
              disp_message (WindowHandle, 'NG', 'image', 12, 12, 'red', 'false')
       endif
       set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
       disp_message (WindowHandle, '孔洞面积:'+AreaHole, 'image', 132, 12, 'black', 'true')
       disp_message (WindowHandle, '矩形度:'+Rectangularity, 'image', 182, 12, 'black', 'true')                           

       stop()
endfor

案例2:检测胶囊药粒

check_blister.hdev

这个案例是使用灰度值和区域面积来判断胶囊是否装错和是否是空的,但是最后一张图片倒数第三个胶囊,它的缺陷是比正常胶囊长度上短一点,使用面积筛选有点困难,所以又加上了一个区域的长度特征。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

dev_set_line_width (3)
dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_color ('red')
dev_update_window ('off')
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')

list_files ('./', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
read_image (Image,ImageFiles[0])

read_image (Image, ImageFiles[0])   
access_channel (Image, Image1, 3)
threshold (Image1, Regions, 75, 255)
opening_circle (Regions, RegionOpening, 2.5)
shape_trans (RegionOpening, RegionTrans, 'convex')//凸性转换
area_center (RegionTrans, Area, RowRef, ColumnRef)
orientation_region (RegionTrans, Phi)
vector_angle_to_rigid (RowRef, ColumnRef, Phi, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
affine_trans_image (Image1, ImageAffineTrans, HomMat2D, 'constant', 'false')

gen_empty_obj (Objects)
for I := 0 to 4 by 1
       for J := 0 to 2 by 1
           r:=87+72*I
           c:=209+150*J
           gen_rectangle2 (ROI_0, r, c, 0, 70, 34)    
           concat_obj (Objects, ROI_0, Objects)
       endfor
endfor
union1 (Objects, RegionUnion)
       
for Index := 0 to |ImageFiles| - 1 by 1
       dev_update_window ('off')
       read_image (Image, ImageFiles[Index])  
       * 定位
       access_channel (Image, Image1, 3)
       threshold (Image1, Regions, 75, 255)
       opening_circle (Regions, RegionOpening, 2.5)
       closing_circle (RegionOpening, RegionClosing1, 2.5)
       shape_trans (RegionClosing1, RegionTrans, 'convex')//凸性转换
       area_center (RegionTrans, Area, Row, Column)
       orientation_region (RegionTrans, Phi)
       vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, 0, HomMat2D)
       affine_trans_image (Image1, ImageAffineTrans, HomMat2D, 'constant', 'false')

       * 检测
       reduce_domain (ImageAffineTrans, RegionUnion, ImageReduced)
       binary_threshold (ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)
       opening_circle (Region, RegionOpening1, 5.5)
       closing_circle (RegionOpening1, RegionClosing, 5.5)
       connection (RegionClosing, ConnectedRegions)
       fill_up (ConnectedRegions, RegionFillUp)
       
       shape_trans (RegionFillUp, RegionTrans1, 'convex')   
       select_shape (RegionTrans1, SelectedRegions, 'area', 'and', 2500, 6000)      
       sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
       * 判断
       count_obj (Objects, Number)
       gen_empty_obj (MissObject)
       gen_empty_obj (ErrorObject)
       numError:=0
       numMiss:=0
       for Index1 := 1 to Number by 1
           select_obj (Objects, ObjectSelected, Index1)
           intersection (ObjectSelected, SortedRegions, RegionIntersection)
           area_center (RegionIntersection, Area1, Row1, Column1)
           * 最后一张图片倒数第三个胶囊要短一些,光靠区域面积很难筛选啊,所以加一个区域长度
           region_features (RegionIntersection, 'width', widthValue)
           if(Area1>0)
                  min_max_gray (RegionIntersection, ImageReduced, 0, Min, Max, Range)
                  if(Area1 < 3800 or Min<65 or widthValue<95)//这种依靠区域面积区分好坏的方法还是不够稳定
                         numError:=numError+1
                         concat_obj (ErrorObject, ObjectSelected, ErrorObject)
                  endif
           else
                  numMiss:=numMiss+1
                  concat_obj (MissObject, ObjectSelected, MissObject)
           endif                          
       endfor
       
       dev_update_window ('on')
       dev_display (ImageAffineTrans)
       dev_set_color ('red')
       dev_display (MissObject)
       dev_set_color ('blue')
       dev_display (ErrorObject)
       disp_message (WindowHandle, 'Miss:'+numMiss, 'image', 12, 12, 'black', 'true')
       disp_message (WindowHandle, 'Error:'+numError, 'image', 52, 12, 'black', 'true')
       disp_message (WindowHandle, 'Right:'+(15-numError-numMiss), 'image', 92, 12, 'black', 'true')

       stop()
endfor

案例3:检查塑料网是否破损

novelty_detection_dyn_threshold.hdev
在这里插入图片描述
在这里插入图片描述

list_files ('./', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 66, 'mono', 'true', 'false')
for Index := 0 to |ImageFiles| - 1 by 1
       read_image (Image, ImageFiles[Index])      
       threshold (Image, Regions, 28, 105)
       connection (Regions, ConnectedRegions)
       select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 450, 10000)
       boundary (SelectedRegions, RegionBorder, 'inner')
       
       count_obj (RegionBorder, Number)
       dev_display (Image)
       dev_display (RegionBorder)
       if(Number>1)
              dev_set_color ('red')              
              disp_message (WindowHandle, 'NG', 'image', 12, 12, 'red', 'false')
       else
              dev_set_color ('green')
              disp_message (WindowHandle, 'OK', 'image', 12, 12, 'green', 'false')
       endif
       dev_display(RegionBorder)

       stop()
endfor

资源下载地址

https://download.csdn.net/download/weixin_38566632/18218221

对这方面技术感兴趣的小伙伴可以关注我,我会持续更新的。别忘了给我点赞哦!

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Halcon是一种常用的图像处理软件,可以用于各种缺陷检测任务。在Halcon中,可以使用不同的算法和技术来进行缺陷检测。根据引用\[1\]中提供的实例,Halcon可以用于背景网格产品刮伤缺陷检测、不均匀表面刮伤检测、产品表面三角缺陷检测、产品毛刺检测、产品上凹坑检测、产品周围缺口检测、电路板短路、断路检测、找出所有网格顶点的位置、化妆品标签褶皱检测、皮革纹理表面缺陷检测、手机摄像头图像表面的轻微缺陷检测、网状产品表面破损检测、铣刀刀口破损缺陷检测和检测印刷数字是否完整等任务。 根据引用\[2\]中的描述,缺陷检测是一项具有挑战性的任务,需要保证稳定性和精度。传统的算法检测缺陷通常需要进行复杂的调试和参数调整,而且容易出现检测不稳定和误测的情况。机器学习和深度学习成为缺陷检测领域的重要技术难点。机器学习方法通常使用类似MLP的神经网络对缺陷特征进行训练和分类。深度学习方法则需要大量的缺陷样本进行训练,并且需要手动标注缺陷位置,训练周期较长。迁移学习法是一种新兴的方法,可以利用已经训练好的网络模型进行缺陷检测。 在日常工程应用中,Halcon通常使用形状匹配进行定位,但当待匹配物体有较大变形时,形状匹配的结果可能不准确,特别是在塑料产品成形时变形或纺织产品因褶皱而变形的情况下。这时需要采用其他方法来获得精确的定位结果。 综上所述,Halcon可以应用于各种缺陷检测任务,并且可以根据具体情况选择合适的算法和技术来实现精确的检测结果。 #### 引用[.reference_title] - *1* [【愚公系列】2023年04月 Halcon机器视觉-15种常用缺陷检测实例](https://blog.csdn.net/aa2528877987/article/details/129943049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于halcon缺陷检测常用方法与示例总结](https://blog.csdn.net/weixin_50016546/article/details/124981131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值