Halcon学习之模板匹配

Halcon提供了许多的匹配方式:
在这里插入图片描述
匹配算法流程:
1.抠图,获取模板区域;
2.创建模板;
3.查找与模板相似区域,获得区域的坐标,角度,比例大小等结果;
4.清除模板

在实际应用中根据选择相应发匹配方式即可;大多数情况下使用基于相关性和基于形状这两种方式。

一、基于相关性
根据灰度做归一化的互相关匹配。可用于线性光照变换、边缘轮廓模糊的情况下。
基本流程:
*1采集图像
read_image (Image, ImageFiles[4])

*2准备模板
gen_circle (ROI_0, 249.543, 341.002, 165.223)
reduce_domain (Image, ROI_0, ImageReduced)
*3创建模板
create_ncc_model (ImageReduced, 4, 0,rad(180), ‘auto’, ‘use_polarity’, ModelID)
*获得模板区域
get_ncc_model_region (ModelRegion, ModelID)//该区域会被仿射变换到原点
get_ncc_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, Metric)
*4查找模板
find_ncc_model (Image, ModelID, 0, rad(270), 0.5, 1, 0.5, ‘true’, 0, Row, Column, Angle, Score)
*5显示
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
affine_trans_region (ModelRegion, RegionAffineTrans, HomMat2D, ‘nearest_neighbor’)
dev_display (Image)
dev_display (RegionAffineTrans)
*6清除模板
clear_ncc_model (ModelID)

重要算子参数说明:

create_ncc_model(Template : : NumLevels,AngleStart, AngleExtent, AngleStep, Metric : ModelID)
参数1:Template ,模板图像
参数2:NumLevels,金字塔层数(0,或’auto’都为自动确认)
参数3:AngleStart,起始角度(单位rad)
参数4:Template ,角度范围(单位rad)
参数5:Template ,角度步长(单位rad)
参数6:Metric ,极性;'use_polarity’为使用极性; 'ignore_global_polarity’为忽略极性
参数7:ModelID,模板句柄

find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)
create_ncc_model(Template : : NumLevels,AngleStart, AngleExtent, AngleStep, Metric : ModelID)
参数1:Image ,图像
参数2:ModelID,句柄
参数3:AngleStart,起始角度(单位rad)
参数4:Template ,角度范围(单位rad)
参数5:MinScore,最小分数(0-1)
参数6:NumMatches,最大匹配数(0为All)
参数7:MaxOverlap,最大重叠率
参数8:SubPixel,亚像素精度
参数9:NumLevels ,金字塔层数
输出:
参数10:Row,匹配到区域中心的行
参数11:Column,匹配到区域中心的列
参数12:Angle,模板旋转到匹配到区域的角度(rad)
参数13:Score,得分(0-1)

二、基于形状
根据边缘方向梯度进行匹配,最常用的方式,可应用与边缘轮廓清晰的情况下
基本流程
*1采集图像
read_image (Image, ImageFiles[0])
*2准备模板
gen_rectangle1 (ROI_0, 189.637, 164.533, 309.563, 435.045)
reduce_domain (Image, ROI_0, ImageReduced)
*3创建模板
create_shape_model (ImageReduced, ‘auto’, 0, rad(360), 0.01, ‘auto’, ‘use_polarity’, ‘auto’, ‘auto’, ModelID)
*4查找
find_shape_model (Image, ModelID, 0, rad(360), 0.7, 1, 0.5, ‘none’, 0, 0.5, Row, Column, Angle, Score)
*5显示
if(|Row| > 0)
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
* affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, ‘nearest_neighbor’)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
dev_display (Image)
dev_display (ContoursAffineTrans)
disp_message (WindowHandle, Score, ‘window’, 12, 12, ‘black’, ‘true’)
Endif
*6清除
clear_shape_model (ModelID)
算法详解:
创建模板算子:
create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
参数1:模板图像
参数2:金字塔最大层数 ‘0’默认,相当与‘auto’
参数3:模板的起始角度 rad
参数4:模板的角度范围 rad
参数5:角度步长 rad
参数6:优化方式,与速度有关
‘none’:不做处理;
‘no_pregeneration’:不预先存储到内存,会慢
‘pregeneration’:预先存储到内存,会快
‘point_reduction_high’, ‘point_reduction_low’, ‘point_reduction_medium’,;减少点数
参数7:极性
‘use_polarity’:使用极性;‘ignore_global_polarity’:忽略全局极性;
‘ignore_local_polarity’:忽略局部极性;'ignore_color_polarity’忽略颜色极性
参数8:模板图像的前景与背景的对比度
参数9:搜索到图像的最小对比度
参数10:模板句柄

寻找模板算子:
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
参数1:搜索图像(可以多通道)
参数2:模型句柄
参数3:模板的起始角度
参数4:模板的角度范围;起始角度和角度范围需比创建模板时的小,不然则采用创建时的参数。
参数5:最小分数(模板与实例的相似度)
参数6:最大的匹配实例的数量;‘0’为全找
参数7:最大重叠度
参数8:亚像素精度
与插值算法相关:’
none’:不采用亚像素; ‘interpolation’,:简单插值
采用最小二乘法: ‘least_squares’, ‘least_squares_high’, ‘least_squares_very_high’
与变形相关:
‘max_deformation 1’, ‘max_deformation 2’, ‘max_deformation 3’,最大变形度为32;
使用该参数时,必须要亚像素;与插值搭配使用:【‘least_squares’,‘max_deformation 5’】
参数9:过程实际采用的金字塔层数
5:从第5层从上往下搜
【5,2】从第5层一直到第2层搜,找到最佳的匹配层数
【5,-2】从第5层搜索到第2层,返回第2层;如果最低层没有结果;采用容差模式(图像离焦时)。写‘0’表示与创建模板的参数一致。
参数10:贪婪度(0-1),0:慢但安全;1,快但可能找不到
参数11:被找到实例中心的行,
参数12:被找到实例中心的列,
参数13:模板旋转到实例的角度
参数14:得分

相关算子:
*检查模板
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
*获取模板的轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
获取模板的参数
get_shape_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
*设置边界是否查找
set_system (‘border_shape_models’, ‘true’)

  • 15
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
* This example shows how to use shape-based matching * in order to find a model region and use it for * further tasks. * Here, the additional task consists of reading text * within a certain region, wherefore the image has * to be aliged using the matching transformation. * * Initialization. dev_update_window ('off') dev_close_window () * Initialize visualization. read_image (ReferenceImage, 'board/board_01') get_image_size (ReferenceImage, Width, Height) initialize_visualization (Width / 2, Height / 2, WindowHandle, WindowHandleText) disp_continue_message (WindowHandle, 'black', 'true') disp_description_text (WindowHandleText) * * Define ROIs: * ROI for the shape model. dev_set_window (WindowHandle) dev_display (ReferenceImage) gen_rectangle1 (ROIModel, 60, 535, 185, 900) dev_display (ROIModel) * ROI for the text. gen_rectangle1 (ROIText, 445, 585, 590, 765) dev_display (ROIText) disp_model_message (WindowHandle) stop () * * Prepare the shape-based matching model. reduce_domain (ReferenceImage, ROIModel, ModelImage) * Create shape model and set parameters (offline step). create_generic_shape_model (ModelHandle) * Train the shape model. train_generic_shape_model (ModelImage, ModelHandle) * * Prepare the text model. create_text_model_reader ('auto', 'Industrial_0-9A-Z_Rej.omc', TextModel) * * We look for the reference transformation which we will need * for the alignment. We can extract it by finding the instance * on the reference image. * Set find parameters. set_generic_shape_model_param (ModelHandle, 'num_matches', 1) set_generic_shape_model_param (ModelHandle, 'min_score', 0.5) find_generic_shape_model (ReferenceImage, ModelHandle, MatchResultID, Matches) get_generic_shape_model_result (MatchResultID, 'all', 'hom_mat_2d', HomMat2DModel) * * Find the object in other images (online step). for i := 1 to 9 by 1 read_image (SearchImage, 'board/board_' + i$'02') find_generic_shape_model (SearchImage, ModelHandle, MatchResultID, Matches) get_generic_shape_model_result (MatchResultID, 'all', 'hom_mat_2d', HomMat2DMatch) * Compute the transformation matrix. hom_mat2d_invert (HomMat2DMatch, HomMat2DMatchInvert) hom_mat2d_compose (HomMat2DModel, HomMat2DMatchInvert, TransformationMatrix) affine_trans_image (SearchImage, ImageAffineTrans, TransformationMatrix, 'constant', 'false') * * Visualization. dev_set_window (WindowHandle) dev_display (SearchImage) get_generic_shape_model_result_object (InstanceObject, MatchResultID, 'all', 'contours') dev_display (InstanceObject) * * Reading text and numbers on the aligned image. reduce_domain (ImageAffineTrans, ROIText, ImageOCR) find_text (ImageOCR, TextModel, TextResultID) get_text_object (Characters, TextResultID, 'all_lines') get_text_result (TextResultID, 'class', RecognizedText) * * Visualization. dev_set_window (WindowHandleText) dev_display (ImageAffineTrans) dev_set_colored (12) dev_display (Characters) disp_finding_text (Characters, WindowHandle, WindowHandleText, RecognizedText) wait_seconds (0.5) endfor disp_end_of_program_message (WindowHandle, 'black', 'true') stop () dev_close_window ()
06-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值