Halcon之模板匹配
参考Halcon样例位于HDevelop示例->方法->模板匹配(基于形状)->pm_multiple_models.hdev。:由于该模板是基于灰度值进行匹配,导致使用时要求图像的光照稳定有较高的要求,在实际中使用的不多。*特别需要注意使用create_ncc_model创建模板后,模板区域角度将自动旋转到0度。:可以解决光照不均,不足,光照变化的场景,以及焦点变化的场景(图像模糊)的模板匹配。
·
常见的模板匹配有三种:
基于灰度值:由于该模板是基于灰度值进行匹配,导致使用时要求图像的光照稳定有较高的要求,在实际中使用的不多。
基于互相关(NCC):可以解决光照不均,不足,光照变化的场景,以及焦点变化的场景(图像模糊)的模板匹配。
*特别需要注意使用create_ncc_model创建模板后,模板区域角度将自动旋转到0度。
场景1:焦距变化,图片模糊。
*本例的目的是检查ncc检测的偏差
*由其参考模型在镜头焦点变化时得到,即在图片模糊时也可很好查找到目标
*迭代遍历序列。这里使用的匹配方案是
* NCC模型。被检测模型在x和y方向上的总体运动
*最终被描绘出来(以像素为单位)。
*
dev_close_window ()
read_image (ImageRef, 'pcb_focus/pcb_focus_telecentric_061')
get_image_size (ImageRef, Width, Height)
dev_open_window_fit_image (ImageRef, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_update_off ()
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (1)
*
* create ncc model
gen_rectangle1 (ModelRegion, 81.5, 148.5, 419.5, 633.5)
reduce_domain (ImageRef, ModelRegion, TemplateImage)
dev_clear_window ()
dev_display (TemplateImage)
disp_message (WindowHandle, 'Creating the ncc model may take a few seconds ... ', 'image', -1, -1, 'black', 'true')
*特别需要注意使用create_ncc_model创建模板后,模板区域角度将自动旋转到0度
*例如模板区域旋转角度是20度使用create_ncc_model创建模板后该区域旋转角度变为0度。
create_ncc_model (TemplateImage, 'auto', -rad(5), rad(10), 'auto', 'use_polarity', ModelID)
*
* find ncc model in image
area_center (ModelRegion, Area, ModelRow, ModelColumn)
Rows := []
Columns := []
for Index := 1 to 121 by 1
read_image (Image, 'pcb_focus/pcb_focus_telecentric_' + Index$'03' + '.png')
find_ncc_model (Image, ModelID, -rad(5), rad(10), 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
Rows := [Rows,Row]
Columns := [Columns,Column]
*特别需要注意使用create_ncc_model创建模板后,模板区域角度将自动旋转到0度所以这里是0
vector_angle_to_rigid (ModelRow, ModelColumn, 0, Row, Column, Angle, HomMat2D)
affine_trans_region (ModelRegion, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
set_system ('flush_graphic', 'false')
dev_display (Image)
dev_display (RegionAffineTrans)
gen_cross_contour_xld (Cross, Row, Column, 12, rad(0))
dev_display (Cross)
disp_message (WindowHandle, 'Finding ncc model in image: ' + Index$'03', 'image', -1, -1, 'white', 'false')
set_system ('flush_graphic', 'true')
disp_line (WindowHandle, -101, -101, -99, -99)
endfor
*
* display results
dev_display (Image)
wait_seconds (1)
gen_contour_polygon_xld (Contour, Rows, Columns)
fit_line_contour_xld (Contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_contour_polygon_xld (Regression, [RowBegin,RowEnd], [ColBegin,ColEnd])
* resize window so that pixels appear square
Ratio := (394 - 389 + 1) / real(252 - 250 + 1)
dev_resize_window_fit_size (0, 0, Height * Ratio, Height, 640, 480)
dev_set_part (250, 389, 252, 394)
dev_display (ImageRef)
dev_set_color ('green')
dev_display (Contour)
dev_set_color ('yellow')
dev_display (Regression)
disp_message (WindowHandle, ['Deviation of ncc matches in (x,y)-direction','while defocusing lens'], 'image', 249.75, 389, 'white', 'false')
disp_message (WindowHandle, ' Deviation (green), Tukey\'s robust regression (yellow) in pixel', 'image', 251.75, 389.25, 'white', 'false')
*
* close all handles
clear_ncc_model (ModelID)

模板图像

模糊的图像也能完成模板查找

场景2:亮度变化
* This example program shows how to use HALCON's correlation-based
* matching. In particular it demonstrates the robustness of this method against
* linear illumination changes. The training is performed in an image with good
* illumination. The matching is applied in images where the exposure time varies
* extremely from very short to very long.
read_image (Image, 'cap_exposure/cap_exposure_03')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_update_window ('off')
gen_circle (Circle, 246, 336, 150)
area_center (Circle, Area, RowRef, ColumnRef)
reduce_domain (Image, Circle, ImageReduced)
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
dev_set_draw ('margin')
dev_display (Image)
dev_display (Circle)
stop ()
Rows := []
Cols := []
for J := 1 to 10 by 1
read_image (Image, 'cap_exposure/cap_exposure_' + J$'02')
find_ncc_model (Image, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D)
affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
Rows := [Rows,Row]
Cols := [Cols,Column]
dev_display (Image)
dev_display (RegionAffineTrans)
stop ()
endfor
* Compute the standard deviation of the found positions. If the individual
* positions in Rows and Cols are examined, it can be seen that the standard
* deviation is caused mainly by the last four images, which are severely
* overexposed.
StdDevRows := deviation(Rows)
StdDevCols := deviation(Cols)
clear_ncc_model (ModelID)
模板图片

不同亮度下均可匹配成功。



样例图片

基于形状的匹配(多模板匹配)
参考Halcon样例位于HDevelop示例->方法->模板匹配(基于形状)->pm_multiple_models.hdev
*多模板匹配案例
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* dev_update_pc ('off')
* dev_update_window ('off')
* dev_update_var ('off')
*模型句柄数组
ModelIdS:=[]
*模型对应轮廓的开始索引数组
IndexS:=[]
*模型对应轮廓结束索引数组
IndexE:=[]
*多模型轮廓集合
gen_empty_obj (Models)
*定义显示轮廓的颜色
Colors:=['red','green','blue']
*加载模板图片
for Index := 1 to 3 by 1
read_image (Image, 'metal-parts/metal-part-model-'+Index$'02')
get_image_size (Image, Width, Height)
dev_resize_window_fit_size (0, 0, Width, Height, -1, -1)
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*获取模板图像
dilation_rectangle1 (Rectangle, RegionDilation, 10, 10)
reduce_domain (Image, RegionDilation, ImageReduced)
*创建模板
create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*获取模板轮廓方法1
*connection (Region, ConnectedRegions)
*获取其轮廓
* gen_contour_region_xld (ConnectedRegions, Contours, 'border_holes')
*获取模板轮廓方法2,注意ModelRegions是边界而不是区域
* inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 30)
* connection (ModelRegions, ConnectedRegions)
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 27.98, 500)
* union1 (SelectedRegions, RegionUnion)
* gen_contour_region_xld (RegionUnion, Contours, 'border')
*获取模板轮廓方法3
get_shape_model_contours (ModelContours, ModelID, 1)
select_contours_xld (ModelContours, SelectedContours, 'contour_length', 20, 2000, -0.5, 0.5)
count_obj (SelectedContours, ContoursNumber)
count_obj (Models, ModelsNumber)
*将模型轮廓添加到集合中
concat_obj (Models, SelectedContours,Models)
*记录该模型轮廓的起始索引与结束索引
IndexS:=[IndexS,ModelsNumber+1]
IndexE:=[IndexE,ModelsNumber+ContoursNumber]
*将轮廓添加到集合中
concat_obj (Models,SelectedContours, Models)
*将模板句柄添加到数组
ModelIdS:=[ModelIdS,ModelID]
disp_message (WindowHandle, '创建模板:'+Index, 'window', 20, 20, 'blue', 'true')
wait_seconds (0.5)
endfor
stop ()
dev_set_line_width (2)
*进行模板匹配
for i := 1 to 15 by 1
read_image (Image, 'metal-parts/metal-parts-'+i$'02')
dev_display (Image)
*进行多模板查找。贪婪系数可影响查找数量,为0时精确查找尽量查找到所有速度慢,为1时快速查找可能有遗漏
find_shape_models (Image, ModelIdS, rad(0), rad(360), 0.5, 0, 0.5, 'least_squares', 0, 0.6, Row, Column, Angle, Score, Model)
*计算匹配到的数量
num:=|Score|
*进行匹配成功的模板轮廓的查找仿射变换
for j := 0 to num-1 by 1
*轮廓集合中获取匹配成功的模型轮廓.
*IndexS[Model[j]]:该模板轮廓在轮廓集合中的起始索引
*IndexE[Model[j]]-IndexS[Model[j]]+1:构成该模板轮廓的轮廓数量
copy_obj (Models, ObjectsSelected,IndexS[Model[j]] , IndexE[Model[j]]-IndexS[Model[j]]+1)
*进行反射变换
vector_angle_to_rigid (0, 0, 0, Row[j], Column[j], Angle[j], HomMat2D)
*设置显示的颜色
dev_set_color (Colors[Model[j]])
affine_trans_contour_xld (ObjectsSelected, ContoursAffinTrans, HomMat2D)
dev_display (ContoursAffinTrans)
endfor
set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
disp_message (WindowHandle, '查找到:'+num+'个', 'window', 20, 20, 'white', 'false')
stop ()
endfor
for t := 0 to 2 by 1
clear_shape_model (ModelIdS[t])
endfor

如果在运行时出现如下显示:

在图形窗口右键->更新窗口->取消“在运行模式”选项,左上角轮廓将不再显示。

更多推荐
所有评论(0)