Halcon例程学习---PrintCheck

一、检测效果

            检测效果还是杠杠的

二、代码解析

1、选择一张标准印刷图片作为模板图片

(1)获取轮廓

dev_update_off ()
read_image (Image, 'pen/pen-01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_color ('red')
dev_display (Image)
* Note: the shape model will be constructed from a ROI that is computed
* automatically based on a simple image segmentation.
threshold (Image, Region, 100, 255)
fill_up (Region, RegionFillUp)
difference (RegionFillUp, Region, RegionDifference)
// 这一句还是很巧妙的:提取到黑色区域之后,用一个多边形变化,把印刷的黑色字符也给包括进去了
shape_trans (RegionDifference, RegionTrans, 'convex')
dilation_circle (RegionTrans, RegionDilation, 8.5)
reduce_domain (Image, RegionDilation, ImageReduced)
// 获取需要检测区域的轮廓
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 20)
gen_contours_skeleton_xld (ModelRegions, Model, 1, 'filter')
area_center (RegionDilation, Area, RowRef, ColumnRef)

(2)创建模板

        此处创建了两个模板:一个是正常的匹配模板:用于寻找需要进行检测的印刷区域。

        一个用于后续比对的变化模板:这个变化模板翻译的不一定准确,意思就是会通过许多标准图片去训练出来了一个参考模板,模式一共两种(均值模板和中值模板,具体的可以自己看Halcon文档说明),训练出来的模板用于后续比对,检测图片上印刷区域同模板的差异

create_shape_model (ImageReduced, 5, rad(-10), rad(20), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID)
create_variation_model (Width, Height, 'byte', 'standard', VariationModelID)

2、循环读取图片,训练变化模板

(1)训练

for I := 1 to 15 by 1
    read_image (Image, 'pen/pen-' + I$'02d')
    find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    if (|Score| == 1)
        *找到检测区域
        vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
        affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
        训练变化模板
        train_variation_model (ImageTrans, VariationModelID)
        dev_display (ImageTrans)
        dev_display (Model)
    endif
endfor

(2)获取训练信息

*获取训练信息:MeanImage--均值图片;VarImage--均值图片和标准图片的差异图片
get_variation_model (MeanImage, VarImage, VariationModelID)
*这个算子的内容需要稍微注意下的,理解一下里面的逻辑,下面单独说明吧
prepare_variation_model (VariationModelID, 20, 3)
* We can now free the training data to save some memory.
* 注意这里只是清除训练中保存的数据,但是并没用清除最终的训练结果
clear_train_data_variation_model (VariationModelID)
*显示上面训练出来的数据(图片信息)
erosion_rectangle1 (RegionFillUp, RegionROI, 1, 15)
dev_display (MeanImage)
set_tposition (WindowHandle, 20, 20)
dev_set_color ('green')
write_string (WindowHandle, 'Reference image')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (VarImage)
set_tposition (WindowHandle, 20, 20)
dev_set_color ('green')
write_string (WindowHandle, 'Variation image')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

   重点解释一下:prepare_variation_model (VariationModelID, 20, 3)

   函数名称:prepare_variation_model( : : ModelID, AbsThreshold, VarThreshold : )

   算子原理:AbsThreshold 和 VarThreshold都可以包含两个值[au,al],[bu,bl];如果两个参数只设定了一个,默认两个参数是相等的。一个用来限定亮区域,一个用来筛选暗区域,其中 i(x,y) 为标准图片,v(x,y) 是与标准图片的差异图片,注意是乘的关系,后面也是。计算方式如下,生产两幅上阈值图片和下阈值图片。

筛选出于模板图片不同区域用的是下面的公式

3、使用模板进行测试

dev_set_draw ('margin')
NumImages := 30
for I := 1 to 30 by 1
    * (1)读取图片进行匹配,然后进行仿射变换
    read_image (Image, 'pen/pen-' + I$'02d')
    find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    if (|Score| == 1)
        vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
        affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
        reduce_domain (ImageTrans, RegionROI, ImageReduced)
        *(2)将当前变换后区域同模板进行对比,得到差异区域,并进行筛选,然后显示印刷缺陷区域
        compare_variation_model (ImageReduced, RegionDiff, VariationModelID)
        connection (RegionDiff, ConnectedRegions)
        select_shape (ConnectedRegions, RegionsError, 'area', 'and', 20, 1000000)
        count_obj (RegionsError, NumError)
        dev_clear_window ()
        dev_display (ImageTrans)
        dev_set_color ('red')
        dev_display (RegionsError)
        set_tposition (WindowHandle, 20, 20)
        if (NumError == 0)
            dev_set_color ('green')
            write_string (WindowHandle, 'Clip OK')
        else
            dev_set_color ('red')
            write_string (WindowHandle, 'Clip not OK')
        endif
    endif
    if (I < NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
clear_shape_model (ShapeModelID)
clear_variation_model (VariationModelID)

4、总结

(1)Halcon提供的这个例程还是很强大的,但是使用情况有所限制,需要印刷的图案的质量比较好,至少通过形状模板能够匹配上,所以在某些情况下可以有比较好的应用
(2)虽然应用场景有所限制,但是整体的算法思路还是可以借鉴的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值