Halcon模板匹配學習:find_aniso_shape_model

(粉色是顯示設置相關,不需要太多關注,黃色爲自己標註,綠色輸入參數,紫色輸出參數)
*去尋找SMD電容元器件, 這些SMD電容元器件在具有10位深度的圖像(類型爲uint2的圖像)中在行和列方向上呈現獨立的尺寸變化。
dev_update_off ()
dev_close_window ()

*爲了可視化,我們指定uint2圖像中的有效位數。 我們這樣做是因爲無法將這些信息存儲在圖像文件本身中。
set_system ('int2_bits', 10)//int2圖像的有效位數。縮放灰度值時使用此數字。如果該值設置爲-1,則灰度值將自動縮放(默認)。值:-1或9..16;默認值:-1

read_image (Image, 'smd/smd_capacitors_01')//讀取圖片
get_image_size (Image, Width, Height)//獲取圖片的寬度和高度
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)//打開一個窗口適應讀取的圖片
dev_display (Image)//顯示圖片
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')//設置字體
Message := 'This program shows how to use shape-based matching'//需要顯示的信息
Message[1] := 'to find SMD capacitors that exhibit independent'
Message[2] := 'size changes in the row and column direction in'
Message[3] := 'images with a depth of 10 bits.'
Message[4] := 'First a synthetic model for the SMD capacitors'
Message[5] := 'is created. In the next step the created model'
Message[6] := 'is used to find the SMD capacitors.'
//需要顯示的信息
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')//顯示信息
disp_continue_message (WindowHandle, 'black', 'true')//顯示“按F5繼續運行”信息
stop ()//程序會在這裏停止
dev_close_window ()//關閉窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)//打開窗口
dev_set_color ('green')//設置顏色
dev_set_line_width (3)//設置線寬

*爲SMD電容器創建綜合模型。 這只是一個帶有圓角的矩形。
gen_contour_polygon_rounded_xld (Contour, [50,100,100,50,50], [50,50,150,150,50], [6,6,6,6,6], 1)//創建帶圓角的多邊形輪廓,座標和圓角可以通過數組的形式指定。輸入Row[50,100,100,50,50]、Col[50,50,150,150,50]、角度[6,6,6,6,6],座標數組的第一個值和最後一個值相同,用以形成一個封閉的多邊形輪廓,故而五個座標形成的是一個四邊矩形,輸出XLD輪廓繪contour*模板匹配時,可以自己創建一個多邊形輪廓來創建匹配模板
gen_image_const (Image, 'byte', 200, 150)//生成一幅固定灰度值的圖像,大小爲200×150
paint_xld (Contour, Image, ImageModel, 128)//將先前建立的XLD輪廓繪製到圖像上,128是灰度值
create_aniso_shape_model (ImageModel, 'auto', -rad(10), rad(20), 'auto', 0.9, 1.7, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 20, ModelID)//爲各向異性尺度不變匹配準備一個輪廓模型
get_shape_model_contours (ModelContours, ModelID, 1)//返回一個輪廓模型的輪廓表示
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')//設置顯示字體
* 在圖片中查找SMD電容的模型並顯示找到模型的數量和時間以及模型的比例

* 這裏的比例是指實際圖形與建立的簡單模型的比例大小

* 按照已知的圖片數量進行循環

for J := 1 to 4 by 1
    read_image (Image, 'smd/smd_capacitors_' + J$'02d')
    dev_display (Image)
    count_seconds (S1)//測量一次時間
    find_aniso_shape_model (Image, ModelID, -rad(10), rad(20), 0.9, 1.7, 0.9, 1.1, 0.7, 0, 0.5, 'least_squares', 0, 0.8, Row, Column, Angle, ScaleR, ScaleC, Score)//在一個圖像中找出一個各向異性尺度不變輪廓的最佳匹配。
    count_seconds (S2)//測量一次時間
    Time := (S2 - S1) * 1000//設置一個變量爲兩次測量時間的差值
    Num := |Score|//獲取匹配模型的數量
    * 顯示找到的模型與匹配模型花費的時間信息
    disp_message (WindowHandle, Num$'d' + ' models found in ' + Time$'5.2f' + ' ms', 'window', 12, 12, 'black', 'true')
    MeanColumn := mean(Column)//獲取找到的矩形列的平均值
    for I := 0 to Num - 1 by 1
        *顯示找到的模型
        hom_mat2d_identity (HomMat2D)//生成相同二維變換的同質變換矩陣
        hom_mat2d_scale (HomMat2D, ScaleR[I], ScaleC[I], 0, 0, HomMat2D)//爲一個同質二維變換矩陣添加一個縮放
        hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)//依照角度旋轉二維矩陣
        hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)//爲一個同質變換矩陣添加一個旋轉
        affine_trans_contour_xld (ModelContours, ContoursTrans, HomMat2D)//對XLD輪廓(contour)進行一個任意二維仿射變換
        dev_display (ContoursTrans)//在當前窗口顯示變換後的圖形
        * 
        * Display the model's scale next to the found model
        ScaleRowStr := 'ScaleRow=' + ScaleR[I]$'5.3f'//在找到的模型旁邊顯示模型的比例
        ScaleColStr := 'ScaleCol=' + ScaleC[I]$'5.3f'
        get_string_extents (WindowHandle, ScaleRowStr, AscentStr, DescentStr, WidthStr, HeightStr)//獲取一個字符串的空間大小
        if (Column[I] <= MeanColumn)//顯示建模的比例信息
            disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] - 60 - WidthStr, 'green', 'false')
        else
            disp_message (WindowHandle, [ScaleRowStr,ScaleColStr], 'image', Row[I] - 20, Column[I] + 60, 'green', 'false')
        endif
    endfor
    * Deactivate the following lines to run the programm without breaks
    if (J < 4)//不激活以下代碼程序將不中斷的運行
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
* 重置uint2圖像的有效位數爲未知
set_system ('int2_bits', -1)


gen_contour_polygon_xld 意思_u013407012的專欄-CSDN博客 https://blog.csdn.net/u013407012/article/details/103167476


Halcon算子_create_aniso_shape_model-CSDN博客 https://blog.csdn.net/coolbee19990/article/details/68058881

create_aniso_shape_model (ImageModel, 'auto', -rad(10), rad(20), 'auto', 0.9, 1.7, 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 'auto', 20, ModelID)//爲各向異性尺度不變匹配準備一個輪廓模型

輸入對象:ImageModel
金字塔層數:自動確定
對象可允許旋轉範圍:[-0.174,0.349],此處是轉換爲了弧度,-rad(10)=-0.174
旋轉步長:自動選擇
行方向允許縮放率範圍:[0.9,1.7]
縮放步長:自動確定
列方向允許縮放率範圍:[0.9,1.1]
縮放步長:自動確定
優化:不需要減少模型點
匹配指標:模板與圖形必須有相同的對比度
對比度閾值:自動確定
最小對比度:20,圖像允許在20個灰度值內波動

模板句柄:ModelID

1° = π / 180 ≈ 0.01745 rad1rad = 180 / π = 57.30°角度制


總結:該例子在模板匹配時,自己創建一個多邊形輪廓來創建匹配模板。

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