Halcon——模板匹配

本文详细介绍了Halcon库中的模板匹配功能,包括形态模板匹配(基于形状的对象定位)、灰度值匹配(考虑像素灰度信息)和组件匹配(检测特定组件)。通过实例展示了如何创建模板、执行匹配和获取匹配结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板匹配是Halcon中的一个重要功能,用于在图像中寻找特定模板的位置或实例。

1、形态模板匹配

基于形状的模板匹配方法,可以用于检测和定位具有特定形状的对象。这种方法通常适用于对形状较为明显的目标进行匹配定位。

* 关闭窗口更新,控制变量,单步的调试会失效
dev_update_off ()
dev_close_window ()
read_image (Image, 'wafer/wafer_mirror_dies_01.png')
* 创建一个和图片大小一样的图形窗口
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_line_width (3)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)

* 确定ROI,确定形状做模板
* 自己手动绘制矩形
gen_rectangle1 (Rectangle, 153,212,205,263)
reduce_domain (Image, Rectangle, ImageReduced)

* 检查形状模板匹配
* 参数一:输入图像
* 参数二:输入图像的图像金字塔
* 参数三:模型区域金字塔
* 参数四:金字塔级别数。
* 参数五:检查匹配结果的阈值,用于过滤匹配得分低于该阈值的结果
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)

* 根据区域创作模板
* 参数一:输入图像
* 参数二:金字塔级别的最大数量。
* 参数三:图案的最小旋转角度
* 参数四:旋转角度的范围
* 参数五:角度的步长(分辨率)
* 参数六:优化的种类和可选使用的方法 用于生成模型。
* 参数七:'use_polarity'表示使用极性信息进行模板匹配。
* 参数八:对比度的阈值
* 参数九:搜索图像中对象的最小对比度。
* 参数十:模型句柄
create_shape_model (ImageReduced, 'auto', rad(0), rad(1), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

* 获取形状模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)


for Index:=1 to 4 by 1
    read_image (Image1, 'wafer/wafer_mirror_dies_'+Index$'02')
    
    * find_shape_model 查找对应的模板
    * 参数一:输入图像
    * 参数二:模型ID(句柄)
    * 参数三、四:角度的起始范围和结束范围
    * 参数五:缩放因子,用于指定匹配时允许的尺度变化范围。
    * 参数六:最小分数,用于筛选匹配结果的最小得分阈值。
    * 参数七:平移不变性,指定了在匹配中是否考虑平移不变性。
    * 参数八:亚像素精度
    * 参数九:匹配中使用的金字塔级别数
    * 参数十:搜索启发式的“贪婪”(0:安全 但速度慢;1:速度快,但可能会错过比赛)。
    * 参数十一、十二:保存匹配到的实例的行坐标和列坐标
    * 参数十三、十四:保存匹配到的实例的角度信息和得分
    find_shape_model (Image1, ModelID, rad(0), rad(1), 0.5, 0, 0.5, 'least_squares', 1, 0.5, Row, Column, Angle, Score)
    
    dev_set_color ('red')
    
    * 生成十字架
    gen_cross_contour_xld (Cross, Row, Column, 6, rad(45))
    
    * 显示找到的轮廓
    dev_display_shape_matching_results (ModelID, 'red', Row, Column, Angle, 1, 1, 0)
    dev_update_on ()
    stop ()
endfor

* 清除形状模型,释放内存并关闭与该模型相关的所有资源
clear_shape_model (ModelID)

在这里插入图片描述

2、灰度值匹配是指在匹配过程中考虑像素的灰度信息,以确定匹配程度。

read_image (Image, 'fabrik')
gen_rectangle1 (Rectangle, 365, 300, 390, 330)
reduce_domain (Image, Rectangle, ImageReduced)
dev_set_color ('red')

* 全局匹配,输出图片中灰度值偏低的位置信息, 
* 参数四:匹配模式。norm_correlation 使用归一化相关性作为匹配度量。dfd:计算平均“位移帧差”:
exhaustive_match (Image, Image, ImageReduced, ImageMatchColor, 'norm_correlation')

threshold (ImageMatchColor, Region1, 250, 255)

在这里插入图片描述

3、组件匹配

组件匹配用于在图像中检测和识别符合特定形状和属性的组件或物体。相当于是形状的拓展,但是不支持大小缩放匹配。适用于多个对象定位的场合

list_files ('D:/Halcon/模板匹配/label', 'files', Files)
* 对文件列表进行正则表达式选择
* 参数一:表示包含文件名的元组或字符串。
* 参数二:正则表达式模式,表示匹配所有文件名。
* 参数三:用于存储符合正则表达式模式的文件名的输出元组
tuple_regexp_select (Files, '.*', Selection)
* 读取图像
read_image (Image, 'label/label_model')
* 提取需要的ROI
gen_rectangle1 (Rectangle, 125, 115, 325, 525)
* 裁剪
reduce_domain (Image, Rectangle, ImageReduced)

* 1、从label——model图像中自动提取出来初始的组件,输出InitialComponents区域
* 提取组件模型的初始组件
* 参数一:输入图像
* 参数二:表示输出的初始化组件。
* 参数三:降低对比度的滞后阈值
* 参数四:对比度的滞后阈值上限
* 参数五:初始组件的最小大小。
* 参数六:自动分段的类型。
* 参数七:可选控制参数的名称。
* 参数八:可选控制参数的值。
gen_initial_components (ImageReduced, InitialComponents, 40, 40, 'auto', 'connection', [], [])

* 声明一个空的对象元组,目的是为了存储行为特征
gen_empty_obj (TraingImages)
for Index := 1 to 5 by 1
    read_image (TraingImage, 'label/label_training_'+Index)
    * 将读取到的图片放入到元组中
    concat_obj (TraingImages, TraingImage, TraingImages)
endfor

* 训练组件之间的相互关系(配置模板的基础匹配信息)
* 2、根据图像模型,初始组件,训练图片,来训练组件和组件的相互关系。
* 为基于组件的匹配训练组件和关系
* 参数一:输入图像
* 参数二:初始化的组件
* 参数三:训练图像数据集,用于模型的训练。
* 参数四:训练得到的模型组件。
* 参数五:降低对比度的滞后阈值 
* 参数六:对比度的滞后阈值上限
* 参数七:连接等值线区域的最小大小。
* 参数八:初始实例的最低分数 要找到的组件。
* 参数九、十:行和列方向的搜索公差
* 参数十一:角度搜索容差。
* 参数十二:训练的可靠性
* 参数十三:求解初始不明确匹配的标准 训练图像中的组件。
* 参数十四:找到的初始分量的最大轮廓重叠 
* 参数十五:对初始组件进行聚类的阈值。
* 参数十六:训练结果的句柄
train_model_components (ImageReduced, InitialComponents, TraingImages, ModelComponents, 40, 40, 20, 0.8, -1, -1, rad(20), 'reliability', 'rigidity', 0.2, 0.5, ComponentTrainingID)

* 3、创建组件模型
* 参数一:训练结果的句柄
* 参数二:元件模型的最小旋转
* 参数三:组件模型的旋转范围
* 参数四:搜索中组件的最小对比度 图像
* 参数五:组件实例的最低分数
* 参数六:组件的最大金字塔级别数
* 参数七:角度的步长(分辨率)
* 参数八:组件的优化类型
* 参数九:匹配用于组件的指标
* 参数十:完成形状模型的预生成 组件,如果等于“真”.
* 参数十一:完成形状模型的预生成 组件,如果等于“真”.
* 参数十二:组件模型的句柄
* 参数十三:表示适合充当根组件
create_trained_component_model (ComponentTrainingID, -rad(30), rad(60), 'auto', 0.5, 'auto', 'auto','none' , 'use_polarity', 'false', ComponentModelID, RootRanking)
* 释放组件训练结果的内存
clear_training_components (ComponentTrainingID)

* 4、查找匹配的组件
for Index1:= 0 to |Files|-1 by 1
    read_image (fileImage, Files[Index1])
    
    * 在图像中查找组件模型的最佳匹配项。
    * 参数一:输入图像
    * 参数二:组件模型的句柄
    * 参数三:根组件的索引
    * 参数四:根组件的最小旋转
    * 参数五:根分量的旋转范围
    * 参数六:组件示例的最低分数
    * 参数七:要成为的组件模型的实例数 找到(或 0 表示所有匹配项)。
    * 参数八:实例的最大重叠 要找到的组件模型。
    * 参数九:缺少根组件时的行为。
    * 参数十:缺少组件时的行为。
    * 参数十一:对未找到的组件进行姿态预测。
    * 参数十二:组件实例的最低分数
    * 参数十三:子像素补偿,如果不是,则组件的亚像素精度 等于“无”.
    * 参数十四:使用的组件的金字塔级别数 匹配 
    * 参数十五:搜索启发式的“贪婪” 组件 (0:安全 但速度慢;1:速度快,但可能会错过比赛)。
    * 参数十六:每个找到的组件实例的起始索引 描述组件匹配的元组中的模型。
    * 参数十七:找到的组件的每个实例的结束索引 描述组件匹配的元组中的模型。
    * 参数十八:找到的组件模型实例的分数。
    * 参数十九、二十:找到的组件的行和列坐标匹配。
    * 参数二十一、二十二:找到的元件的旋转角度和分数。
    * 参数二十三:找到的组件的索引
    find_component_model (fileImage, ComponentModelID, RootRanking, -rad(30), rad(60), 0.5, 0, 0.5, 'stop_search', 'prune_branch', 'none', 0.5, 'least_squares', 4, 0.9, ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp)
    
    dev_display (fileImage)
    for Match:=0 to |ModelStart|-1 by 1
        dev_display (fileImage)
        
        * 获取找到的组件模型实例信息
        * 参数一:找到所选组件模型的组件 实例。
        * 参数二:组件模型的句柄。
        * 参数三:每个找到的组件实例的起始索引 描述组件匹配的元组中的模型。
        * 参数四:找到的组件的每个实例的结束索引 模型到描述组件匹配的元组。
        * 参数五、六:找到的组件的行和列坐标匹配。
        * 参数七:找到的元件的旋转角度匹配。
        * 参数八:找到的组件匹配的分数。
        * 参数九:找到的组件的索引
        * 参数十:找到的组件模型实例的索引
        * 参数十一:标记组件的方向。
        * 参数十二、十三:所选组件的行和列坐标 模型实例。
        * 参数十四、十五:所选模型的所有组件的旋转角度和组件的分数 实例。
        get_found_component_model (FoundComponents, ComponentModelID, ModelStart, ModelEnd, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp, Match, 'false', RowCompInst, ColumnCompInst, AngleCompInst, ScoreCompInst)
        
        dev_display (FoundComponents)
    endfor
    
    if(|ScoreComp| < 5)
        disp_message (200000, '找不到的索引是:'+(Index1+1), 'window', 12, 12, 'black', 'true')
    endif
    
    if(Index1 < |Files|-1)
        disp_continue_message (200000, 'black', 'true')
        stop ()
    endif
endfor

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### Halcon C++ 模板匹配使用方法 在Halconc++中,模板匹配是一项重要的图像处理技术,用于识别和定位特定模式或对象。为了创建一个有效的模板匹配算法,通常需要定义模板、设置参数并执行匹配过程。 #### 创建NCC模型 创建标准化互相关(Normalized Cross Correlation, NCC)模型是模板匹配的关键步骤之一。这涉及到指定模板图像以及其他必要的配置选项: ```cpp void HNCCModel::CreateNccModel(const HImage& Template, const HTuple& NumLevels, // 金字塔层级 double AngleStart, // 起始角度 double AngleExtent, // 角度跨度 const HTuple& AngleStep, // 角度步长 const HString& Metric // 匹配极性 ) { // 实现细节... } ``` 此函数接受多个参数以控制模板的特性及其旋转范围[^2]。 #### 执行模板匹配 一旦建立了NCC模型,则可以调用相应的函数来进行实际的匹配操作。下面是一个简单的例子展示如何加载一幅测试图,并应用之前建立好的NCC模型去寻找最佳匹配位置: ```cpp #include "halcon.h" int main(){ try{ HHaltonic hal; HWindow win; // 加载待检测图片 HImage image("test_image.png"); // 初始化窗口显示 win.OpenWindow(0, 0, 512, 512); win.DispImage(image); // 假设已经有一个预先构建好的HNCCModel实例model HNCCModel model; // 设置搜索区域和其他必要条件 HTuple row, col, angle, score; model.FindNccModel(image, &row, &col, &angle, &score); // 显示结果 cout << "Match found at (" << row.D() << ", " << col.D() << ") with rotation=" << angle.D()*RADTODEG << endl; return EXIT_SUCCESS; } catch(HException e){ cerr << "Error occurred:" << e.what(); return EXIT_FAILURE; } } ``` 这段代码展示了基本的工作流程——从读取输入图像到最终输出找到的目标坐标及方向角。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值