Halcon例程分析4:基於形狀的模板匹配

打開halcon,按下ctrl+e打開halcon自帶例程。方法->模板匹配(基於形狀)->find_scaled_shape_model.hdev

此方法通過形狀的輪廓來查找,主要用於需要尋找的物體輪廓清晰,黑白特徵明顯,輪廓架構相對簡單的情形。

* This example program shows how to find scaled and rotated shape models.
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
*讀取圖片
read_image (Image, 'green-dot')
*獲取圖片尺寸
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_color ('red')
*顯示圖片
dev_display (Image)
*閾值化,選擇黑色的區域
threshold (Image, Region, 0, 128)
*對閾值化出來的黑色區域做分割處理
connection (Region, ConnectedRegions)
*根據面積這個特徵選擇,在圖形窗口上顯示ConnectedRegions這個圖像,
*右鍵-》工具-》特徵檢測,選中需要的區域查看其面積值,這個例程中是14805
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000)
*填充區域
fill_up (SelectedRegions, RegionFillUp)
*用圓形卷積覈對圖像做腐蝕操作,稍微擴大感興趣區域的面積,最後一個參數是卷積核半徑
dilation_circle (RegionFillUp, RegionDilation, 5.5)
*在原圖像上只選中我們感興趣的區域
reduce_domain (Image, RegionDilation, ImageReduced)
*上面的操作只是爲了把需要尋找的區域範圍圈出來,我們完全可以直接手動繪製出來的
*下面是創建模板
*第一個參數(ImageReduced)是輸入圖像,即需要尋找輪廓的那個圖像,
*第二個參數(5)是金字塔層數
*第三個參數(rad(-45))是起始角度值,這個指的是需要尋找的那個模型的可能角度值
*第四個參數(rad(90))是角度大小,在這個例子中是-45到45°總共90°範圍內尋找模板,超過這個範圍的不會被找到
*第五個參數('auto')是角度步長
*第六個參數(0.8)是最小縮放因子
*第七個參數(1。0)是最大縮放因子
*第十個參數(40)是對比度閾值,即在這幅圖像中所需要找的輪廓與背景的像素差值,這裏可以是一個數組,如果輸入的是一個數組,第一個數值是最小閾值,第二個數值是最大閾值,最終尋找在這個閾值範圍內的輪廓
*最後一個輸出參數模型ID
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 80, 10, ModelID)
*通過ID獲取到模型的輪廓,這個輪廓的中心位置在圖像的原點位置處
get_shape_model_contours (Model, ModelID, 1)
*下面的仿射變換是爲了顯示用的
*求出最初感興趣區域的中心位置座標
area_center (RegionFillUp, Area, RowRef, ColumnRef)
*求出原圖形輪廓相對原點的仿射變換矩陣
vector_angle_to_rigid (0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
*把查找出來的輪廓變換到原圖像的模型位置處
affine_trans_contour_xld (Model, ModelTrans, HomMat2D)
*顯示
dev_display (Image)
dev_display (ModelTrans)

*讀取圖像
read_image (ImageSearch, 'green-dots')
dev_display (ImageSearch)
*對圖像查找模板
*第一個參數(ImageSearch)需要查找模板的輸入圖像
*第二個參數(ModelID)已經創建的模板的ID,
*第三個參數(rad(-45))是起始角度值,這個指的是需要尋找的那個模型的可能角度值
*第四個參數(rad(90))是角度大小,在這個例子中是-45到45°總共90°範圍內尋找模板,超過這個範圍的不會被找到
*第五個參數(0.8)是最小縮放因子
*第六個參數(1.0)是最大縮放因子
*第七個參數(0.5)是最小分數,查找到的模板都會有一個分數值,這個值越大說明越像模板,越小越不像,低於這個分數就認爲不是同一個東西了
*第八個參數(0)查找的模板個數,爲0時說明把所有出現的全部查找出來
*第九個參數(0.5)是允許兩個模板間最大重疊的部分是多少,如果設置爲0說明不允許兩個模型重疊,可以在這個例子中試一下
*第十個參數('least_squares')是亞像素精度參數,這裏用最小二乘求更高精度的像素
*第十一個參數(5)金字塔層數
*第十一個參數(0.8)是貪婪度
*後面的參數是查找到的模型的輸出值,如果找不到則其值爲空,找到多個則其值爲一個數組,每個數據對應一個相應的模型
find_scaled_shape_model (ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)

*下面是爲了顯示出查找到的模型,做仿射變換把輪廓變換到相應圖像上的位置,應爲輪廓始終是在原點上的,但查找到的參數只有其中心點座標,角度,縮放因子等參數
*通過仿射變換把原輪廓變換到相對應的位置上
for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
    affine_trans_contour_xld (Model, ModelTrans, HomMat2DScale)
    dev_display (ModelTrans)
endfor

模板圖像與模板輪廓

查找的圖像與查找到的輪廓

上面是官方例程,下面是一個手機攝像頭模組裝配對位的項目,原理與上面官方例程完全一致

* This example program shows how to find scaled and rotated shape models.
dev_update_pc('off')
dev_update_window('off')
dev_update_var('off')
read_image(Image, 'C:/Users/Administrator/Desktop/1.bmp')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_set_color('red')
dev_display(Image)
threshold(Image, Region, 0, 30)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 96000, 96105)
fill_up(SelectedRegions, RegionFillUp)
dilation_circle(RegionFillUp, RegionDilation, 5.5)
*gen_rectangle1(ROI_0, 265, 194, 490, 911)
reduce_domain(Image, RegionDilation, ImageReduced)
create_scaled_shape_model(ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
get_shape_model_contours(Model, ModelID, 1)
area_center(RegionFillUp, Area, RowRef, ColumnRef)
vector_angle_to_rigid(0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_contour_xld(Model, ModelTrans, HomMat2D)
dev_display(Image)
dev_display(ModelTrans)
read_image(ImageSearch, 'C:/Users/Administrator/Desktop/5.bmp')
dev_display(ImageSearch)
find_scaled_shape_model(ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
for I : = 0 to | Score | -1 by 1
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_translate(HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
hom_mat2d_rotate(HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
hom_mat2d_scale(HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
affine_trans_contour_xld(Model, ModelTrans, HomMat2DScale)
dev_display(ModelTrans)
endfor

手機攝像頭模組原始測試圖

查找效果圖

發佈了60 篇原創文章 · 獲贊 8 · 訪問量 9691
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章