Halcon模板匹配學習:create_average_shape_model

*此示例演示瞭如何從一組樣本中創建模型以實現更高的魯棒性。 這個想法是從給定對象的一組樣本中創建一個平均圖像,以平均化諸如表面紋理、形狀或大小變化之類的干擾因素。

*爲了執行此操作,首先需要對齊樣品。 在該特定示例中,採樣對識別和配準通過基於對象幾何先驗知識人造模型形狀的匹配

(粉色是與dev_相關函數,與窗口和圖像的顯示、設置有關,綠色_model是模型的構建、尋找有關

dev_update_off ()//一般dev_update_off放在開始,dev_update_on放在程序結束
dev_close_window ()//關閉活動圖形窗口
read_image (Image, 'smd/smd_samples')//讀圖Image,路徑‘smd/smd_samples’
get_image_size (Image, Width, Height)//獲得圖像的大小
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)//打開讀入圖像大小的活動圖形窗口,窗口句柄WindowHandle
dev_display (Image)//顯示圖像
dev_set_line_width (2)//設置區域輪廓的線寬
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')//設置窗口字體屬性,窗口句柄WindowHandle,size=14,Font=momo,bold是否加粗=true,slant是否斜體=flase
* 參數MinScore設置的越大,搜索的就越快。如果模板在圖像中沒有被遮擋,MinScore可以設置爲0.8,甚至爲0.9
MinScore1 := 0.65
MinScore2 := 0.8
create_reference_image (ReducedReferenceImage)//庫裏面自帶的模型調用

*
area_center (ReducedReferenceImage, Area, RowRef, ColumnRef)//測得ReducedReferenceImage區域的面積(像素個數)和中心位置(座標平均值)
get_image_size (ReducedReferenceImage, RefImgWidth, RefImgHeight)
dev_open_window (0, Width + 12, 3 * RefImgWidth, 3 * RefImgHeight, 'black', WindowHandleAvg)
set_display_font (WindowHandleAvg, 14, 'mono', 'true', 'false')
dev_display (ReducedReferenceImage)
disp_message (WindowHandleAvg, '1. Search artificial model', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')
//圖像顯示“Press Run (F5)to continue”
stop ()
*目前顯示: 
* Search artificial model in image with set of sample objects 使用一組樣本對象在圖像中搜索人工模型
create_scaled_shape_model (ReducedReferenceImage, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 30, 3, ModelID)//創建模板模型
get_shape_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)//得到模板模型
find_scaled_shape_model (Image, ModelID, rad(0), rad(180), 0.77, 0.78, MinScore1, 0, 0, 'interpolation', 2, 0.7, Row, Column, Angle, Scale, Score)//尋找模板模型

dev_set_window (WindowHandle)//激活一個圖形窗口
dev_display (Image)
dev_set_color ('green')
//設置一個或多個輸出顏色
dev_display_shape_matching_results (ModelID, 'green', Row, Column, Angle, Scale, Scale, 0)//顯示匹配結果
disp_message (WindowHandle, 'MinScore: ' + MinScore1, 'window', 12, 12, 'black', 'true')//顯示 'MinScore: ' + MinScore1
stop ()

* Average over all matches and calculate the average image 在所有匹配中取平均值並計算平均圖像
dev_set_window (WindowHandleAvg)//激活一個圖形窗口
dev_set_line_width (2)
get_shape_model_contours (ModelContours, ModelID, 1)//返回形狀模型ModelID表示形式,作爲ModelContours中的XLD輪廓線
gen_empty_obj (Templates)// Create an empty object tuple 創建一個空數組
for K := 0 to |Row| - 1 by 1
    vector_angle_to_rigid (RowRef, ColumnRef, 0, Row[K], Column[K], Angle[K], HomMat2DTranslate)//從點和角度計算剛性仿射變換。
    hom_mat2d_scale (HomMat2DTranslate, Scale[K], Scale[K], Row[K], Column[K], HomMat2DScale)//將縮放比例添加到齊次的2D轉換矩陣。
    hom_mat2d_invert (HomMat2DScale, HomMat2DInvert)//hom_mat2d_invert反轉HomMat2D給出的齊次2D轉換矩陣。 結果矩陣在HomMat2DInvert中返回。
    affine_trans_image (Image, ImageAffineTrans, HomMat2DInvert, 'constant', 'false')//將任意仿射2D變換(即縮放,旋轉,平移和傾斜(傾斜))應用於Image中給出的圖像,並在ImageAffineTrans中返回變換後的圖像。
    crop_rectangle1 (ImageAffineTrans, ImagePart, 0, 0, 80, 130)//切出一個或多個矩形圖像區域。
    concat_obj (Templates, ImagePart, Templates)//連接兩個標誌性對象元組。
    * 
    dev_set_window (WindowHandle)
    if (K > 0)
        dev_display_shape_matching_results (ModelID, 'green', Row[K - 1], Column[K - 1], Angle[K - 1], Scale[K - 1], Scale[K - 1], 0)
    endif
    dev_display_shape_matching_results (ModelID, 'yellow', Row[K], Column[K], Angle[K], Scale[K], Scale[K], 0)
    dev_set_window (WindowHandleAvg)
    dev_display (ImagePart)

    wait_seconds (0.2)
endfor
* Average template image
channels_to_image (Templates, MultiChannelImage)// 變換單通道圖到多通道圖
mean_n (MultiChannelImage, ImageMean)//多個通道上的平均灰度值
dev_set_window (WindowHandle)
dev_display_shape_matching_results (ModelID, 'green', Row[K - 1], Column[K - 1], Angle[K - 1], Scale[K - 1], Scale[K - 1], 0)
dev_set_window (WindowHandleAvg)
dev_display (ImageMean)
disp_message (WindowHandleAvg, 'Average object image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()


* Use the average image to create a model that resembles more closely 使用平均圖像創建更接近於smd實際外觀的模型
* the actual appearance of the smd
create_scaled_shape_model (ImageMean, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 45, 30, ModelIDAvg)
find_scaled_shape_model (Image, ModelIDAvg, rad(-1), rad(2), 0.77, 0.78, MinScore2, 0, 0, 'interpolation', 2, 0.5, Row, Column, Angle, Scale, Score)

dev_display (ImageMean)

disp_message (WindowHandleAvg, 'Resulting shape based model', 'window', 12, 12, 'black', 'true')
get_shape_model_contours (ModelContoursAvg, ModelIDAvg, 1)
area_center (ImageMean, Area1, Row1, Column1)
vector_angle_to_rigid (0, 0, 0, Row1, Column1, 0, HomMat2D)//從點和角度計算剛性仿射變換
affine_trans_contour_xld (ModelContoursAvg, ContoursAffineTrans, HomMat2D)//對XLD輪廓應用任意仿射2D變換。
dev_set_color ('yellow')
dev_display (ContoursAffineTrans)
disp_continue_message (WindowHandleAvg, 'black', 'true')

stop ()

dev_set_window_extents (-1, -1, Width, Height)
dev_display (Image)
dev_set_color ('green')
dev_display_shape_matching_results (ModelIDAvg, 'green', Row, Column, Angle, Scale, Scale, 0)
disp_message (WindowHandleAvg, 'MinScore: ' + MinScore2, 'window', 12, 12, 'black', 'true')


create_shape_model(
Template : : //reduce_domain後的模板圖像
NumLevels,//金字塔的層數,可設爲“auto”或0—10的整數
AngleStart,//模板旋轉的起始角度
AngleExtent,//模板旋轉角度範圍, >=0
AngleStep,//旋轉角度的步長, >=0 and <=pi/16
Optimization,//設置模板優化和模板創建方法
Metric, //匹配方法設置
Contrast,//設置對比度
MinContrast ://設置最小對比度
ModelID ) //輸出模板句柄

find_shape_model(
const Hobject& Image, //搜索圖像
Hlong ModelID, //模板句柄
Double AngleStart, // 搜索時的起始角度
Double AngleExtent, //搜索時的角度範圍,必須與創建模板時的有交集。
Double MinScore, // 輸出的匹配的質量係數Score 都得大於該值
Hlong NumMatches, // 定義要輸出的匹配的最大個數
Double MaxOverlap, // 當找到的目標存在重疊時,且重疊大於該值時選擇一個好的輸出
const char* SubPixel, // 計算精度的設置,五種模式,多選2,3
Hlong NumLevels, // 搜索時金字塔的層數
Double Greediness , //貪婪度,搜索啓發式,一般都設爲0.9,越高速度快容易出現找不到的情況
Halcon::HTuple* Row, //輸出匹配位置的行座標
Halcon::HTuple* Column, //輸出匹配位置的列座標
Halcon::HTuple* Angle, //輸出匹配角度
Halcon::HTuple* Score ) //輸出匹配質量

模板建立參考:

Creat_average_shape_model.hdev例程相關學習(一)_人工智能_SRT字符不夠的博客-CSDN博客 https://blog.csdn.net/u013404374/article/details/46942397

find_shape_mode參數詳解及時長優化:https://blog.csdn.net/u013698770/article/details/52198568

超級詳細的create_shape_model和find_shape_model算子的詳細講解:https://blog.csdn.net/maweifei/article/details/78188993


affine_trans_image將任意仿射2D變換(即縮放,旋轉,平移和傾斜(傾斜))應用於Image中給出的圖像,並在ImageAffineTrans中返回變換後的圖像。 仿射變換由HomMat2D中給出的齊次變換矩陣描述,該矩陣可以使用運算符hom_mat2d_identity,hom_mat2d_scale,hom_mat2d_rotate,hom_mat2d_translate等創建,也可以是vector_angle_to_rigid等運算符的結果。

放射變換參考:HALCON視覺算子2D/3DTransformations相關函數中文說明Tools(1)-代碼狗 https://www.daimadog.com/3008.html


顯示相關dev_參考:Halcon知識點隨記(每日更新) - 楊萌珂 - 博客園 https://www.cnblogs.com/yangmengke2018/p/9630974.html


左圖是採用庫裏面自帶的圖像建立的模板,MinScore=0.65

右圖是採用多個對象建立的平均模板,MinScore=0.8

  1. 總結:採用多個對象建立的平均模板,具有更強的魯棒性,克服因爲紋理、大小以及形狀變化產生的干擾
  2. 分析:模板採用的是正面圖,沒有歪斜,測試圖片中的目標對象與模板對象相差無幾,沒有角度、大小的變化,過於理想。
  3. 實際應用可參考性:多個對象建立平均模板
  4. 後期:關於仿射變換沒有弄懂,後期再更新。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章