Halcon视觉实战例程之基于形状的模板匹配2(多对多)

该例程是基于形状的模板匹配(多对多),适用于形状特征比较明显,且有多个模板、需识别出多个轮廓的情况。

*模板匹配基于形状多对多 2020/3/23

*更新
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
dev_close_window ()

*设置轮廓样式,线宽
read_image (Image1, 'C:/1.png')
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 24, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (5)

*创建空模板(存放多个模板区域信息)
gen_empty_obj (Models)
IndexS:=[]
IndexE:=[]
ModelIDs:=[]
stop()

*开始创建模型
list_files ('C:/多对多匹配模板图片', ['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 (Image1, ImageFiles[Index])
    rgb3_to_gray (Image1, Image1, Image1, Image)
    disp_message (WindowHandle, '开始抠图', 'window', 12, 12, 'pink', 'false') 
    
    if(Index = 0)
    *用于图1
    gen_circle (ROI_0, 254.627, 181.205, 92.4421)
    else
    *用于图2
    gen_rectangle2 (ROI_0, 245.064, 208.249, rad(-10.3378), 69.3968, 60.4693)
    endif
    
    reduce_domain (Image, ROI_0, ImageReduced)
    create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
    inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 5, 30)
    get_shape_model_contours (ModelContours, ModelID, 1)
    count_obj (ModelContours, NumModel)
    count_obj (Models, NumModels) 
    concat_obj (Models, ModelContours, Models)
    IndexS := [IndexS,NumModels + 1]
    IndexE := [IndexE,NumModels + NumModel]
    ModelIDs := [ModelIDs,ModelID]
endfor
stop()

*开始识别
read_image (Image3, 'C:/1.png')
rgb3_to_gray (Image3, Image3, Image3, ImageGray)
scale_image (ImageGray, ImageScaled, 1.90299, -84)
dev_open_window_fit_image (ImageScaled, 0, 0, -1, -1, WindowHandle1)
dev_display (ImageScaled)
count_seconds (t1)
find_shape_models (ImageScaled, ModelIDs, rad(0),rad(360), 0.4, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
count_seconds (t2)
Time := (t2 - t1) * 1000

*显示
if(|Score|>0)
    Num := |Score|
    for J := 0 to Num - 1 by 1
        copy_obj (Models, ModelSelected, IndexS[Model[J]], IndexE[Model[J]] - IndexS[Model[J]] + 1)
        vector_angle_to_rigid (0, 0, 0, Row[J], Column[J], Angle[J], HomMat2D)
        affine_trans_contour_xld (ModelSelected, ModelTrans, HomMat2D)
        dev_display (ImageScaled)
        if(Model[J]==0)
            dev_set_color ('red')
        elseif(Model[J]==1)
            dev_set_color ('green')
        endif
        dev_display (ModelTrans)
    endfor
endif

*显示文字
set_display_font (WindowHandle1, 24, 'mono', 'true', 'false')
dev_set_color ('yellow')
set_tposition (WindowHandle1, 20, 20)
if (Num == 1)
    write_string (WindowHandle1, Num$'1d' + ' object found in ' + Time$'4.2f' + 'ms')
else
    write_string (WindowHandle1, Num$'1d' + ' objects found in ' + Time$'4.2f' + 'ms')
endif

识别结果
在这里插入图片描述
模板图片(该例程的模板图片和测试图片都是从超人视觉初级班课程里截图的)
在这里插入图片描述
在这里插入图片描述
测试图片
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值