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

創建模板圖像

查找到的圖像分類結果

 

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