halcon学习之solution matching模型的选择和创建

本文详细介绍了Halcon中的图像匹配技术,包括匹配的基本概念、主要方法及其应用场景。讲解了通过灰度值及像素关系建立模型的标准灰度匹配法和相关性匹配法,以及通过对象轮廓和边界建立模型的方法,如形状匹配、内容匹配等。还介绍了模型创建的具体步骤和模型的重复利用方法。

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

1      matching指的是从一张图片中找出既有对象的位置的方法,这些方法可以应用来很多不同的领域。匹配的主要方式是使用一个所找对象的模板,创建一个模型来用于在图片中搜索。
在halcon中,主要有两大类匹配方法,一类 使用对象的灰度值以及像素点和周边像素的关系来建立匹配模型,另一类 则根据对象的轮廓形状来进行匹配。匹配的输出信息通常为图片中的位置信息,一般应用中,也会需要尺度,角度等相关信息。
2       匹配的大体步骤:
a。创建一个对象的特征模型用于后续匹配
一个对象的模型指的是一个用来描述所搜索对象的内在特点的数据结构, 模型通常可以用对象的标准图片或者合成模型。创建方法取决于具体应用
b。 在测试图中找到相应对象模型
c。 清除模型内存

3.     可选的匹配方法
A) 通过描述灰度值以及周边像素的关系来创建模型的方法
     -标准灰度值匹配法   
     -相关性匹配法,这种方法试用了Normalized Cross correlation(NCC)方法来进行匹配
(此算法参见《 机器视觉算法与应用》的书)
B)通过描述对象的轮廓和边界来创建匹配模型
     -根据形状来匹配、
     -根据内容来匹配,这种方法主要用于特殊的情况:对象的几个部分存在相互关系,一部分随着另一部分运动的情况
     -局部变动匹配法,这个方法可以返回可变对象的模型,允许细微的修改图像相应的的局部区域
     -透视变动匹配法,这个方法可以处理真正的3D对象(而非由2D图像的各种参数来计算出的3D模型)
     -描述符匹配法,通过匹配一些interest 点来进行匹配,同样可以处理3D对象的匹配。

4, 方法的选择

 
 

 
 

二,匹配过程
通常的匹配过程是首先准备参照图片和样板,并用他们创建匹配模型,修改这个模型(如果需要),并保存这个模型以及他的相关搜索索引,用于以后重复使用,下面是进行模型搜索并输出结果,最后清空内存。

1, 创建一个样板image template并建立模型(model)
在对参考图片进行一系列预处理之后,匹配过程的第一步就是创建所找对象的一个样板。在很多情况下,model来源于参考图,它是参考图经过选择性 剪切后留下的样板图template image。对于另外一些匹配方法,并没有直接从参考图中剪出样板图,而是通过多张参考图来 合成出一个新的样板图片template image或者是 XLD格式的边界

1.1 从参考图片中直接剪出样板图片
选择出用于模型的区域(可以是任意形状),用reduce_domain剪切出ROI区域,即样板图片,可用于上述生成模型的方法的输入。
@ 通过输入参数来创建一个region:使用Operatiors》Regions》Creation。如果形状比较复杂,可以考虑使用draw 操作来画出需要的区域。

@通过图像处理来选择区域:blob analysis,segment。 通过用threshold操作,connection,fill_up, select_shape操作来获取形状。除此之外,可以用visualization》feature inspection来选取合适的特征或者值。更复杂的情况可以通过用union2和difference操作来选取复杂的样板图形。

1.2 , 合成的样板
@合成一个样板图片
合成的样板图片主要适用于相关性匹配(correlation-based matching)和一些基于边界的2D方法。 在一些应用中,例如硬币检测(见下图),可能单纯的从参考图片中提取样板图非常复杂,没有任何图片可以直接剪切出来作为合适的样板(因为都有误差),如果简单地剪切出样板,进行匹配时候由于ROI区域不可避免的存在错误,会导致部分应选的输出结果没有被选择,解决这个问题的办法就是用ring shape 来代替circle shape,减少了误差存在的中心区域,可以很大的提高样板的适用性,可以使用合成样板。
 
 

下面介绍如何创建这样一个合成的样板模型:
step 1:创建一个XLD边界
使用gen_ellipse_contour_xld或者手动选择ROI或者使用形态学处理,产生一个感兴趣对象的边界。注意合成的图片应该比实物稍微大一些因为所有在region外面的像素点都在创建图像金字塔时候被使用(基于形状的匹配)。

step 2: 创建一个空白的图片,然后插入这个XLD边界
使用gen_image_const来创建图片,并且用paint_xld来插入边界
gen_image_const (EmptyImage, 'byte', SizeSynthImage, SizeSynthImage)
paint_xld (Circle, EmptyImage, SyntheticModelImage, 128)

step 3: 创建模型
根据图片创建模型
create_scaled_shape_model (SyntheticModelImage, 'auto', 0, 0, 0.01, 0.8, 
1.2, 'auto', 'none', 'use_polarity', 30, 10, 
ModelID)
或者create_shape_model, create_aniso_shape_model来建立模型

1.3, 使用XLD边界来创建模型
同样是上面的问题,除了合成样板,还可以通过减少错误区域的方式来解决问题。当使用基于形状的匹配方法时候并不需要使用边界合成一个样板图片,而是可以直接用XLD边界作为模型(不需要提供样板图片)
用户只需要使用create_shape_model_xld, create_scaled_shape_model_xld 或者 create_aniso_shape_model_xld来创建模型(注意这里的输入仅仅是XLD边界)。

下面是在create_shape_model_xld.dev例子中,具体基于形状的匹配法中创建模型(边界是输入):
gen_circle_contour_xld (ContCircle, 300, 300, MeanRadius, 0, 6.28318, 
'positive', 1)
create_shape_model_xld (ContCircle, 'auto', 0, 0, 'auto', 'auto', 
'ignore_local_polarity', 10, ModelID)

对于另外的方法,create_local_deformable_model_xld for the local
deformable matching(可变匹配法)和create_planar_uncalib_deformable_model_xld 或者create_planar_calib_deformable_model_xld, 用在 perspective deformable matching(透视匹配法).

注意:因为使用边界作为输入时候没有任何极性(polarity即角度方向偏转位移等信息)信息,所以必须规定Metric属性来确定尺度标准(极性被忽略),但问题是,这样做会是搜索变得缓慢,所以halcon提供了途径来检测一个实例中的polarity信息。如下:
       如下图,首先在一张包含典型极性信息的搜索图片中使用慢速搜索,用得到的信息来设置。把模型的边界投射到找到的位置,然后使用下面语句( set_shape_model_metrix)来设置基于形状的匹配,使用(set_local_deformable_model_metric)来设置局部可变匹配法,使用(set_planar_uncalib_deformable_model_metric或者set_planar_calib_deformable_model_metric)来设置透视可变匹配法。在做完这些后,polarity信息就被存储到model中了(Metric可以被设定为 ' use_polarity’),从而一高速度和效果。
 
 

例子:
 
 

1.4 , 使用DXF文件来创建model,可以用read_contour_xld_dxf来读取边界,具体信息这里先不讨论。

2,模型的重复利用,具体参考solution:
2.1 保存
write_shape_model (ModelID, ModelFile)
但是模型中的region并没有保存,如果需要重复使用,需要使用
ModelRegionFile := 'model_region_nut.png'
write_image (ImageROI, 'png', 0, ModelRegionFile)
然后清除
clear_shape_model (ModelID)
2.2 读取
read_shape_model (ModelFile, ReusedModelID)
get_shape_model_contours (ReusedShapeModel, ReusedModelID, 1)
get_shape_model_origin (ReusedModelID, ReusedRefPointRow, ReusedRefPointCol)
get_shape_model_params (ReusedModelID, NumLevels, AngleStart, AngleExtent, \
AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, \
MinContrast)

读取region
read_image (ImageModelRegion, 'model_region_nut.png')
get_domain (ImageModelRegion, DomainModelRegion)

后面可以直接进行find_shape_model等操作,相当于已经创建了模型

3,模型匹配后的结果
 
 
<think>我们正在处理用户关于Halcon调用深度学习模型的问题。根据引用内容,我们可以总结以下关键点:1.引用[1]提到:在Halcon中加载预训练模型使用命令`read_dl_model('model_file.h5','keras')`。这里模型文件是H5格式,指定后端为'keras'。2.引用[2]强调Halcon与深度学习框架结合的优势,但未提供具体调用方法。3.引用[3]展示了训练自定义模型的部分参数函数`lib_dl_segmentation_train`,但用户问题是关于调用(即加载使用)模型。因此,用户意图是了解如何在Halcon中调用(加载使用)深度学习模型。回答步骤:1.加载模型:使用`read_dl_model`算子。2.准备数据:将输入图像转换为深度学习模型所需的格式(预处理)。3.应用模型:使用`apply_dl_model`算子进行推理。4.后处理:解析模型输出(如分类结果、目标检测框、分割掩码等)。注意:Halcon支持多种深度学习任务(分类、目标检测、语义分割等),具体后处理方式因任务而异。根据引用[1],加载模型时需指定模型文件路径框架(如'keras')。但注意,Halcon也支持其他格式(如ONNX),因此需要根据模型文件类型调整。另外,Halcon提供了一些预训练模型,可以直接使用,也可以加载自定义训练的模型。示例代码(以图像分类为例):```python*加载模型read_dl_model('path/to/your_model.h5','keras',DLModelHandle)*准备输入数据(假设有一张图像Image)*首先,获取模型要求的图像尺寸等信息get_dl_model_param(DLModelHandle,'image_dimensions',ImageDimensions)*然后,将输入图像预处理(调整尺寸、归一化等)preprocess_dl_model(Image,ImagePreprocessed)*应用模型进行推理apply_dl_model(DLModelHandle,ImagePreprocessed,DLResult)*后处理:获取分类结果get_dl_model_result(DLResult,'classification','all',ClassResult)*ClassResult包含类别信息```注意事项:-不同任务(如目标检测)的后处理方式不同,需使用对应的参数。-预处理步骤可能包括归一化、调整通道顺序等,需根据模型要求进行。相关问题:1.Halcon支持哪些深度学习框架训练的模型?2.如何处理Halcon深度学习模型的输入输出?3.如何针对目标检测任务调用Halcon深度学习模型?4.在Halcon中调用深度学习模型时常见的错误有哪些?5.Halcon深度学习模型部署的硬件要求是什么?</think>### Halcon 调用深度学习模型的方法 在 Halcon 中调用深度学习模型主要分为以下步骤,遵循"加载→预处理→推理→后处理"的工作流: #### 1. **加载模型** 使用 `read_dl_model` 算子加载预训练模型文件: ```python * 加载Keras格式的模型 read_dl_model ('model_file.h5', 'keras', DLModelHandle) ``` 支持格式包括: - Keras (.h5) - ONNX (.onnx) - Halcon 原生格式 (.hdl)[^1] #### 2. **数据预处理** 将输入图像转换为模型要求的格式: ```python * 调整尺寸归一化 preprocess_dl_model (InputImage, ImagePreprocessed, DLPreprocessParam) ``` 关键预处理操作: - 尺寸调整(需匹配模型输入层) - 像素值归一化(通常归一化到 $[0,1]$ 或 $[-1,1]$) - 通道顺序转换(BGR↔RGB)[^3] #### 3. **模型推理** 应用模型进行预测: ```python * 执行推理 apply_dl_model (DLModelHandle, ImagePreprocessed, DLResult) ``` #### 4. **结果解析** 根据任务类型处理输出: ```python * 分类任务:获取类别概率 get_dl_model_result (DLResult, 'classification', 'all', ClassResult) * 目标检测:获取边界框 get_dl_model_result (DLResult, 'detection', 'all', BoundingBoxes) * 语义分割:获取掩码图 get_dl_model_result (DLResult, 'segmentation', 'all', SegmentationMask) ``` ### 关键注意事项 1. **硬件加速**: ```python * 启用GPU加速 set_system ('cuda', 'true') ``` 2. **批处理优化**: ```python * 设置批处理大小 set_dl_model_param (DLModelHandle, 'batch_size', 8) ``` 3. **模型兼容性**: - 输入尺寸需匹配 `get_dl_model_param (DLModelHandle, 'image_dimensions')` - 输出层名称需与 `get_dl_model_result` 参数一致[^3] ### 典型应用场景 - 工业缺陷检测:结合 Halcon 的传统图像处理与深度学习分类 - 医学图像分析:使用预训练分割模型处理CT/MRI图像 - 实时目标跟踪:在视频流中连续调用检测模型[^2] --- ### 相关问题 1. Halcon 加载 ONNX 模型时需要哪些特殊处理? 2. 如何优化 Halcon 深度学习模型的推理速度? 3. 在工业检测场景中,Halcon 与传统深度学习框架(如 TensorFlow)有何协作方式? 4. 如何处理 Halcon 深度学习模型输出中的假阳性问题? 5. 哪些硬件配置能最大化 Halcon 深度学习模块的性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值