Halcon模板匹配

模板匹配的目的:给定一个模板图片,给它标定一个目标区域。当下一张图片进来的时候,希望在新的图片中找到目标区域。

 

1.如图所示,读取模板图片,然后标定目标区域。

read_image(Image, 'C:/Users/HJ/Desktop/test_image/AB1.jpg')

draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1(Rectangle, Row1, Column1, Row2, Column2)
reduce_domain(Image, Rectangle, ImageReduced)

 

2.创建一个模板shape模型, 然后再获取shape模型的轮廓表示

create_shape_model(ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

get_shape_model_contours(ModelContours, ModelID, 2)

 

3.读取新的图片,然后寻找图像中shape模型的最佳匹配

read_image (Image2, 'C:/Users/HJ/Desktop/test_image/AB3.jpg')

find_shape_model(Image2, ModelID, -0.39, 0.79, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)

 

4.当得分Score的个数大于0时, 进行仿射变换,然后 对xld轮廓应用2d仿射变换

if (|Score| > 0)
  vector_angle_to_rigid(0, 0, 0, Row, Column, Angle, HomMat2D)
  affine_trans_contour_xld(ModelContours, ContoursAffineTrans, HomMat2D)

 

代码总合:

read_image(Image, 'C:/Users/HJ/Desktop/test_image/AB1.jpg')
get_image_size(Image, Width, Height)

* dev_close_window()
dev_open_window(0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display(Image)

draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1(Rectangle, Row1, Column1, Row2, Column2)
reduce_domain(Image, Rectangle, ImageReduced)

*创建一个模板模型
*Template:输入的图像,它的区域被用于创造模型
*NumLevels: 控制级别,可选:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'
*AngleStart:最小的旋转弧度。建议值:-3.14, -1.57, -0.79, -0.39, -0.20, 0.0
*AngleExtent:旋转角度的范围, 建议值:6.29, 3.14, 1.57, 0.79, 0.39
*AngleStep :角度的步长, 建议值: 'auto', 0.0175, 0.0349, 0.0524, 0.0698, 0.0873
*Optimization :优化, 建议值:'auto', 'no_pregeneration', 'none', 'point_reduction_high', 'point_reduction_low', 'point_reduction_medium', 'pregeneration'
*Metric :匹配的衡量标准, 建议值:'ignore_color_polarity', 'ignore_global_polarity', 'ignore_local_polarity', 'use_polarity'
*Contrast :对比度。建议值:'auto', 'auto_contrast', 'auto_contrast_hyst', 'auto_min_size', 10, 20, 30, 40, 60, 80, 100, 120, 140, 160
*MinContrast :最小对比度。它的值要比Contrast小。 建议值:'auto', 1, 2, 3, 5, 7, 10, 20, 30, 40
*ModelID :返回的是ModelID ,也就是模型的句柄
create_shape_model(ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

*ModelContours:返回的是形状模型的轮廓表示
*ModelID :输入的模型句柄
*Level :返回的轮廓的金字塔级别, 建议值: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
*Level为1时, 返回的轮廓是原图的1, Level为2时,轮廓显示为原图的1/2
get_shape_model_contours(ModelContours, ModelID, 1) draw_rectangle1(WindowHandle, Row11, Column11, Row21, Column21) gen_rectangle1(RectangleRoi, Row11, Column11, Row21, Column21) area_center(Rectangle, AreaRef, RowRef, ColumnRef) read_image (Image2, 'C:/Users/HJ/Desktop/test_image/AB3.jpg') *寻找图像中形状模型的最佳匹配 *Image:输入的图片 *ModelID :模型句柄 *AngleStart :最小的旋转弧度。建议值:-3.14, -1.57, -0.79, -0.39, -0.20, 0.0 *AngleStep :角度的步长, 建议值: 'auto', 0.0175, 0.0349, 0.0524, 0.0698, 0.0873 *MinScore:最低得分,在(0,1)这个区间。建议值:0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 *NumMatches:找到的模型的实例数,也就是找到的匹配的个数 *MaxOverlap:找到的形状的最大重叠度。建议值:0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 *SubPixel:亚像素精度 *NumLevels: 匹配过程中的级别,可选:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 *Greediness :搜索启发式的贪婪级别,值越大,搜索速度越快,但可能会漏失。建议值零到一之间 *返回的是找到的形状的行坐标Row和列坐标Column, 以及角度angle和对应的得分Score find_shape_model(Image2, ModelID, -0.39, 0.79, 0.5, 2, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) if (|Score| > 0) *仿射变换 vector_angle_to_rigid(0, 0, 0, Row, Column, Angle, HomMat2D) *对XLD轮廓应用任意仿射2D变换 affine_trans_contour_xld(ModelContours, ContoursAffineTrans, HomMat2D) *仿射变换,求第二个region与标定区域的仿射变换矩阵 vector_angle_to_rigid(RowRef, ColumnRef, 0, Row, Column, Angle, HomMat2D1) affine_trans_region(RectangleRoi, RegionAffineTrans, HomMat2D1, 'nearest_neighbor') reduce_domain(Image2, RegionAffineTrans, ImageReduced1) endif clear_shape_model(ModelID)

 

posted @ 2022-07-04 16:30  小女孩真可爱  阅读(1498)  评论(0编辑  收藏  举报