Halcon例程分析9:多模板形状匹配的物品分类

打开halcon,按下ctrl+e打开halcon自带例程。方法->模板匹配(基于形状)->matching_coins.hdev

下面的例程经过改动,官方例程是用本地函数,我这里为方便说明把本地函数全部写在主函数中

* distinguishing of coins with the help of shape-based matching
* 
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_window ('off')
*定义硬币归属地数组变量
Names := ['german','italian','greek','spanish']
*定义一个空数组,用来存放模板ID,总共4种硬币,有4个模板
Models := []
for i := 0 to 3 by 1
    read_image (Image, 'coins/20cent_' + Names[i])
    dev_display (Image)
    *train_model (Image, ModelID)
     *阈值化处理
    threshold (Image, Region, 70, 255)
    *分割图像
    connection (Region, ConnectedRegions)
    *选择最大面积区域
    select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
    *形成凸包,把区域转变成圆形区域
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    *获取区域中心座标
    area_center (RegionTrans, Area, Row, Column)
    *在区域中心位置处生成一个半径120的圆形区域作为创建模板的ROI
    gen_circle (Coin, Row, Column, 120)
    *创建模板的图像阈值定义
    Contrast := 20
    HysteresisContrast := [Contrast / 2,Contrast + 6,10]
    reduce_domain (Image, Coin, ImageReduced)
    *Called during the test phase to see if Contrast is selected correctly
    *inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, HysteresisContrast)
     *创建模板
    create_shape_model (ImageReduced, 'auto', 0, rad(360), 'auto', 'none', 'ignore_local_polarity', HysteresisContrast, 5, ModelID)
    *把模板ID添加到Models这个数组中
    Models := [Models,ModelID]
endfor
for i := 1 to 13 by 1
    read_image (Image, 'coins/20cent_' + i$'.2' + '.png')
    *find_coin (Image, Models, Row, Column, Angle, Score, ModelIdx)
    *locate_coin (Image, Coin)
    threshold (Image, Region, 70, 255)
    connection (Region, ConnectedRegions)
    select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    area_center (RegionTrans, Area, Row, Column)
    gen_circle (Coin, Row, Column, 120)
    area_center (Coin, Area, Row, Column)
    gen_circle (Circle, Row, Column, 35)
    reduce_domain (Image, Circle, ImageReduced)
    *
    *这个函数注意与find_shape_model函数区分。这个是寻找有多个模板的函数,第二个参数是模板ID数组
    *而find_shape_model是只有一个模板,这两个函数查找的对象数目由第六个参数定义
    *这个函数最后一个输出参数是与目标匹配的模板ID序号,从0开始
    find_shape_models (ImageReduced, Models, 0, rad(360), 0.6, 1, 0, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
    *获取模板轮廓,第二个参数是模板ID
    get_shape_model_contours (ModelContours, Models[Model], 1)
    *旋转平移变换把模板位置变换到相应查找到的目标上
    vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
    *显示图像,显示轮廓
    dev_display (Image)
    dev_set_color ('green')
    dev_set_line_width (2)
    dev_display (ContoursAffineTrans)
    set_tposition (WindowHandle, 24, 12)
    *写出对应查找到的目标的国籍信息
    write_string (WindowHandle, Names[Model])
    *display_model (Image, Models[ModelIdx], Row, Column, Angle, Names[ModelIdx], WindowHandle)
    stop ()
endfor

创建模板图像

查找到的图像分类结果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章