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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例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

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

### FlexNet 许可管理工具及其功能 FlexNet Publisher 提供了一系列强大的许可管理和分析工具,帮助软件供应商有效控制和优化其产品授权机制。这些工具不仅支持多种类型的许可证发放方式,还提供了详细的报告生成功能来跟踪许可证的使用情况。 #### Floating License Administrator 工具 对于采用浮动许可证模式的产品而言,“Floating License Administrator”按钮通常位于Keil μVision 5环境中[^1]。此工具主要用于管理浮动许可证服务端配置,允许管理员执行如下操作: - 设置并启动/停止浮动许可证服务器; - 配置网络参数以及指定可用TCP端口范围; - 查看当前已签发出去的许可证状态; - 解决可能出现的服务故障问题,例如当`lmgrd`无法打开指定TCP端口号时所引发错误[^2]; 通过上述特性可以看出,该工具为维护团队提供了一个集中式的平台来进行日常运维工作,从而提高了工作效率和服务质量。 ```bash # 启动 lmgrd 守护进程示例命令 $ /usr/local/flexnet/lmgrd -c /path/to/license/file.lic & ``` #### 其他常用FlexNet工具介绍 除了“Floating License Administrator”,还有其他几个重要的组件构成了完整的FlexNet生态系统: - **FLEXnet Licensing Administration Tool (FLAT)**:这是一个图形界面应用程序,旨在简化许可证文件创建过程,并能够处理复杂的多级分层结构。 - **flexnetoperations**:作为一款云端解决方案,它使得企业可以更轻松地部署跨多个地理位置分布式的许可证管理系统。 - **License File Editor**:用于编辑现有的许可证定义文件(.lic),修改其中的各项属性而不必重新生成整个文档。 综上所述,借助于这一套全面而灵活的工具集,无论是小型开发工作室还是大型跨国公司都能够找到适合自己需求的最佳实践方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MechMaster

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

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

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

打赏作者

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

抵扣说明:

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

余额充值