halcon 缺陷检测--形状匹配+差分

本文介绍了如何使用Halcon库进行缺陷检测,通过形状匹配和模板提取技术,对含有多个工件的图片进行处理,提取每个工件并进行定位。作者详细展示了从ROI选择、模板创建到匹配过程的代码实现和最终效果。

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

一、前言

    本篇主要总结使用halcon 做缺陷检测的一个常用思路,当一张图片拍摄多个待检测工件,常用方法是由预先建立好的模版图像,采用 形状匹配+查分方法抠下每个工件,逐个检测。

    形状匹配比灰度值匹配要更为可靠

二、代码

  代码是对一张有10个茶杯的图片进行演示

取第一个茶杯ROI作为模版,提取边缘作为形状匹配对的模版

  

set_system ('clip_region', 'false') //设置剪切为false
read_image (Image, 'E:/halcon-study/test_shape_match/002.jpg')

rgb1_to_gray(Image,ImageGray) 


***对截取的ROI滤波去除干扰
mean_image (ImageGray, ImageMean, 3, 3)

***选取ROI区域
*gen_rectangle2 (ModelRegion, 24.29, 20.63, rad(0), 40, 60)
gen_rectangle1 (ModelRegion, 94, 45, 177,131)
reduce_domain (ImageMean, ModelRegion, ImageROI)



***创建模型
create_shape_model (ImageROI, 1, -rad(120), rad(240), 'auto', 'auto', 'use_polarity', 70, 65, ModelID)

inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion,1, 70)


ModelFile := 'model.shm'

write_shape_model (ModelID, ModelFile)
clear_shape_model (ModelID)

*读取形状模板
read_shape_model (ModelFile, ReusedModelID)

*获取新装模板的轮廓,区域坐标等信息
*并在最后变换至原图去
get_shape_model_contours (ModelContours, ReusedModelID, 1)


get_shape_model_params (ReusedModelID[0], _, AngleStart, AngleExtent, _, _, _, _, _, mincon)
minScore := 0.7
*匹配数量,先验知识
numMatches := 10


*max_deformation 5表示的是允许变形5个像素值,0-32,0表示不允许变形,数字越大越耗时间
SubPix := ['least_squares','max_deformation 5']

NumLevels := 4
bFind := false
for Index4 := 1 to 2 by 1
    if(Index4 > 1)
        if(bFind)
            break
        endif
        NumLevels := 2
    endif
    for minScoreSelect := minScore to 0.2 by -0.1
        *AngleStart,AngleExtent必须使用文件导出的
        find_shape_models (ImageMean, ReusedModelID, AngleStart, AngleExtent, minScoreSelect,\
                numMatches, 0.0001, SubPix, min2(NumLevels,7),\
                   0.9, RowCheck, ColumnCheck, AngleCheck, Score, Model)
        if(|ColumnCheck| == numMatches)
            bFind := true
            break
        endif
    endfor

endfor

*由模版外部轮廓生成眼膜mask
select_obj (ModelContours, ModelCont0, 1) 
get_contour_xld (ModelCont0, Row, Col)   
gen_region_polygon (Region, Row, Col)
shape_trans (Region,RegionTrans,'convex')


gen_empty_obj (RegionWaits)

*将模型轮廓变换为检测到的位置
dev_display (Image)
for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2D)
    hom_mat2d_rotate (HomMat2D, AngleCheck[I], 0, 0, HomMat2D)
    hom_mat2d_translate (HomMat2D, RowCheck[I], ColumnCheck[I], HomMat2D)
    affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
    affine_trans_region( RegionTrans,RegionTransNew ,HomMat2D ,'false'  )
    
    reduce_domain( ImageGray ,RegionTransNew , ImageReduce )
    
    concat_obj (RegionWaits, ImageReduce, RegionWaits)
    
    dev_set_color ('green')
    dev_display (RegionTransNew)
    dev_set_color ('red')
    dev_display (TransContours)
    
endfor
stop ()  

三、效果

   最后将边缘匹配到各个茶杯的效果

并且可以把每个茶杯使用掩膜仿射变换到各个匹配好的茶杯位置,并由reduce_domain 抠取下来保存在 RegionWaits 中

 

### 使用Halcon实现基于形状的缺陷检测 #### 形状匹配与差异分析相结合的方法 在使用 Halcon 进行基于形状的缺陷检测时,一种常见且有效的方式是结合形状匹配和图像差分技术。这种方法适用于批量处理多工件的情况,在单张图片中可以识别并分离各个待测对象以便逐一检验其是否存在形变或其他类型的瑕疵。 对于具体的实施过程: - **模板创建**:首先需要获取标准无损产品的高质量样本作为参照模型,并利用 `create_shape_model` 函数构建出精确描述目标轮廓特征的几何模式[^3]。 ```cpp // 创建形状模型 gen_empty_obj (ModelID) read_image (Image, 'standard_part') reduce_domain (Image, Region, ImageReduced) edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 255) shape_trans (Edges, ContoursTrans, 'contour_to_region') connection (ContoursTrans, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegion, 'max_area') create_shape_model (SelectedRegion, &ModelID, 'angle_start' => -pi/8,'angle_extent'=> pi/4,'min_score'=>0.7 ) ``` - **定位与分割**:接下来运用已训练好的形状模型去搜索新采集到的产品图像里相似的对象实例位置;一旦找到合适的候选区域,则可通过形态学操作将其从背景和其他干扰物中区分出来. ```cpp find_shape_model (ImageTest, ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, ResultHandle) get_shape_model_contour(ResultHandle, RowBegin, ColumnBegin, Phi, PointNums, RowContour, ColContour) gen_region_polygon_filled(RowContour,ColContour,PartRegion) difference(ImageDomain, PartRegion, RestOfImage) ``` - **缺陷判定**:最后一步是对提取出来的每一个单独零件执行细致审查——通常会计算测试样品同理想模板之间的灰度级变化程度来量化可能存在的制造误差或是损伤情况。如果两者间的差别超过了设定阈值,则认为该部件不合格. ```cpp abs_diff_images(PartImageTemplate, PartImageActual, DiffImage) convert_image_type(DiffImage, GrayDiffImage, 'byte') threshold(GrayDiffImage, RegionsThreshold, ThresholdMin, ThresholdMax) area_center(RegionsThreshold, AreaDefect, CenterRow, CenterColumn) if(AreaDefect > DefectAreaLimit){ // 记录缺陷信息... } ``` 上述流程不仅能够高效地完成自动化质量控制任务,而且还能适应多种复杂环境下的应用场景需求。值得注意的是,在实际部署前还需针对特定行业特点调整相应参数设置以达到最佳性能表现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值