模板匹配

合集下载

模板匹配的概念 -回复

模板匹配的概念 -回复

模板匹配的概念-回复模板匹配的概念及其应用引言在计算机视觉领域中,模板匹配是一种常用的图像处理技术。

它通过在待检测图像中搜索特定的模板,并找到模板在图像中的位置和形状,为后续的分析和处理提供基础。

本文将详细介绍模板匹配的概念、原理及其应用。

一、模板匹配的概念1.1 模板模板是用来表示目标形状或特征的图像片段,通常由一个小矩形区域组成。

模板可以是简单的几何形状,也可以是复杂的图像。

1.2 模板匹配模板匹配是指在待检测图像中寻找与给定模板最相似的子图像的过程。

其基本思想是通过计算图像中每个可能位置与模板之间的相似度,找到相似度最高的位置作为匹配结果。

二、模板匹配的原理2.1 相似度度量模板匹配的核心问题是如何度量两个图像之间的相似度。

常用的相似度度量方法包括平方差和相关性等。

平方差方法基于图像灰度值之间的差异计算相似度。

具体来说,对于待检测图像中的每个像素与模板的对应像素,计算其差的平方,并将所有像素的平方差累加得到相似度。

相关性方法通过计算待检测图像和模板的归一化互相关函数来度量相似度。

互相关函数表示了两个图像在不同位置上的相关性,相似度取决于互相关函数的峰值。

2.2 模板匹配方法常用的模板匹配方法包括全局匹配和局部匹配。

全局匹配将整个待检测图像与模板进行相似度计算,选取相似度最高的位置作为匹配结果。

这种方法适用于模板占据整个图像或目标的形状相对简单的情况。

局部匹配将待检测图像分割为多个小块,每个小块与模板进行相似度计算,再通过聚类等方法找到最佳匹配位置。

这种方法适用于目标在图像中的位置不确定或存在多个目标的情况。

三、模板匹配的应用3.1 目标识别与跟踪模板匹配在目标识别与跟踪中发挥着重要作用。

它可以用于检测、识别和跟踪图像中的目标,如人脸、车辆、物体等。

通过对目标特征进行建模并与图像进行匹配,可以实现目标的定位和跟踪。

3.2 图像检索模板匹配可以应用于图像检索中。

通过将待检索图像与数据库中的模板进行匹配,可以找到相似度最高的图像,实现基于内容的图像检索。

halcon模板匹配讲解

halcon模板匹配讲解

在HALCON中,模板匹配是一种常见的方法,用于在一幅图像中查找与给定模板最匹配的区域。

这种方法可以用于目标检测、图像分割、模式识别等应用。

在HALCON中,模板匹配主要通过使用`find_template`函数来实现。

该函数用于在一幅图像中查找与给定模板最匹配的区域,并返回匹配区域的坐标、大小和旋转角度等参数。

在使用`find_template`函数进行模板匹配时,需要提供以下参数:
1. 输入图像:要进行匹配的图像。

2. 模板图像:用于匹配的模板图像。

3. 搜索区域:在输入图像中搜索模板的区域,通常可以指定一个矩形区域或者整个图像。

4. 匹配参数:用于控制匹配算法的参数,例如相似性度量、搜索策略等。

在HALCON中,还可以使用`create_template`函数来创建模板图像,以便后续使用。

该函数可以根据给定的图像和参数来生成模板,并返回模板的句柄。

此外,为了提高匹配的准确性和效率,还可以使用一些优化技术,
例如使用多级金字塔、使用滤波器进行预处理、使用约束条件等。

总之,HALCON中的模板匹配是一种强大的工具,可以用于各种图像处理任务。

通过正确地选择和使用匹配算法和参数,可以获得准确和高效的匹配结果。

模板匹配的原理

模板匹配的原理

模板匹配的原理一、模板匹配的概念和应用模板匹配是一种常见的图像处理技术,它可以在一幅图像中寻找与给定模板相似的区域。

模板匹配在很多领域都有广泛的应用,比如物体识别、人脸识别、指纹识别等。

二、模板匹配的原理1. 像素级比较模板匹配最基本的原理就是对两个图像进行像素级比较。

首先将模板图像和待匹配图像分别转化为灰度图像,然后将它们按照一定的步长进行滑动,每次计算两个图像之间的差异,并记录下最小误差值。

2. 相关系数法相关系数法是一种常见的模板匹配算法。

它通过计算两个图像之间的相关系数来判断它们之间的相似度。

具体来说,相关系数越大,则两个图像之间越相似;反之,则差异越大。

3. 归一化互相关法归一化互相关法也是一种常见的模板匹配算法。

它通过计算两个图像之间的归一化互相关函数来判断它们之间的相似度。

具体来说,归一化互相关函数越大,则两个图像之间越相似;反之,则差异越大。

三、模板匹配的实现步骤1. 加载图像和模板首先需要加载待匹配的图像和模板图像,并将它们转化为灰度图像。

2. 定义匹配算法根据需要选择合适的匹配算法,比如相关系数法或归一化互相关法。

3. 设置滑动窗口根据需要设置滑动窗口的大小和步长,以便在待匹配图像中搜索与模板相似的区域。

4. 计算误差值对于每个滑动窗口位置,计算它与模板之间的误差值,并记录下最小误差值和对应的位置坐标。

5. 绘制匹配结果将最小误差值和对应位置坐标绘制在待匹配图像上,以便观察匹配结果。

四、模板匹配的优缺点1. 优点:(1) 简单易懂:模板匹配原理简单易懂,容易实现;(2) 实时性好:模板匹配可以实时处理大量数据;(3) 适用范围广:模板匹配可以应用于很多领域,比如物体识别、人脸识别等。

2. 缺点:(1) 效果受限:模板匹配的效果受到模板图像的质量和待匹配图像的复杂度影响;(2) 复杂度高:对于大规模数据或者复杂场景,模板匹配的计算复杂度会很高;(3) 鲁棒性差:对于光照变化、噪声等干扰因素,模板匹配的鲁棒性较差。

opencv模板匹配6种方法 总结

opencv模板匹配6种方法 总结

opencv模板匹配6种方法总结
OpenCV中的模板匹配是一种常见的图像处理技术,用于在图像中查找与
给定模板相匹配的区域。

以下是OpenCV中模板匹配的6种方法:
1. ():这是最基本的方法,它使用滑动窗口在源图像中查找与模板相匹配的区域。

它返回一个包含每个匹配区域位置和相似度的二维数组。

2. _CCOEFF:这是使用余弦相似度作为匹配度量的一种方法。

它计算模板
和源图像之间的余弦相似度,并返回与模板匹配的区域位置和相似度。

3. _CCOEFF_NORMED:这是使用归一化余弦相似度作为匹配度量的一种
方法。

它计算模板和源图像之间的归一化余弦相似度,并返回与模板匹配的区域位置和相似度。

4. _CCORR:这是使用相关系数作为匹配度量的一种方法。

它计算模板和源图像之间的相关系数,并返回与模板匹配的区域位置和相似度。

5. _CCORR_NORMED:这是使用归一化相关系数作为匹配度量的一种方法。

它计算模板和源图像之间的归一化相关系数,并返回与模板匹配的区域位置和相似度。

6. _SQDIFF:这是使用平方差异作为匹配度量的一种方法。

它计算模板和源图像之间的平方差异,并返回与模板匹配的区域位置和差异值。

总结来说,这6种方法都使用了不同的相似度度量来在源图像中查找与模板相匹配的区域。

其中,()是最基本的方法,而其他方法则提供了不同的相似度度量选项。

选择哪种方法取决于具体的应用场景和需求。

模板匹配的方法

模板匹配的方法

模板匹配的方法宝子!今天咱来唠唠模板匹配这事儿。

模板匹配呢,就像是找拼图的那一块合适的拼图块。

比如说你有一堆形状各异的小图案,要在一个大的模板里找到完全能对上的。

在实际情况里,图像的模板匹配就是在一幅大图像里找有没有和小模板图像一模一样或者很相似的部分。

你可以想象成在一幅超级大的风景画里找有没有那个小小的你画的小房子图案。

那在数据处理或者文本处理方面呢,模板匹配也很有趣。

就拿文本来说吧,假如你有一个特定的句子模板,像“我[动作]在[地点]”。

然后你有一堆句子,像“我跑步在操场”“我看书在图书馆”,这就是匹配上了模板的。

它就像是按照一个特定的规则去筛选合适的内容。

有一种简单的模板匹配方法是直接对比。

就像两个小朋友比身高一样,一个一个地去看数值或者特征是不是一样。

在图像里就是看每个像素点的颜色值之类的是不是相同。

不过这种方法有点傻愣愣的,要是图像稍微有点变化,像颜色淡了一点或者歪了一点,可能就匹配不上了。

还有一种更聪明点的方法,叫基于特征的模板匹配。

就好比看人不是看整个人,而是看他有啥特别的地方,像大鼻子或者大眼睛。

在图像里就是找那些关键的特征点,像角点之类的。

文本里就是找那些关键词。

这样的话,即使有些小变化,只要关键的特征或者关键词还在,就能匹配上。

在做模板匹配的时候呢,也会遇到不少麻烦事儿。

比如说噪声的干扰。

就像你在很吵的环境里听人说话,可能就听不清关键内容,图像里的噪声就会让一些像素点的值变得乱七八糟,影响匹配。

还有尺度的问题,就像小蚂蚁看大象和我们看大象,看到的大小不一样。

图像或者数据可能有不同的尺度,这时候就得想办法把它们变成能比较的尺度才能准确匹配。

不过呢,模板匹配虽然有这些麻烦,但它还是很有用的。

在很多领域都能大展身手,像是在计算机视觉里找特定的物体,在信息检索里找符合特定格式的信息之类的。

宝子,你看,模板匹配是不是还挺有意思的呀?。

模板匹配的原理

模板匹配的原理

模板匹配的原理介绍模板匹配是一种常用的计算机视觉技术,用于在图像中寻找和定位特定模式或对象。

它通过比较输入图像和预先定义的模板图像之间的相似度来实现。

原理模板匹配的原理是将预先定义的模板图像与输入图像进行比较,并找到最佳匹配位置。

它基于以下假设:输入图像中的目标物体在某种程度上与模板图像相似,因此在两者重叠的区域中应存在相似性。

根据这个假设,模板匹配算法的目标是找到输入图像中与模板图像最相似的区域。

步骤模板匹配算法通常包括以下步骤:1.选择模板图像:首先需要选择一个代表目标物体的模板图像。

模板图像应该具有清晰的边界和独特的特征。

2.确定相似度度量:根据实际需求,选择合适的相似度度量方法。

常用的度量方法有差异度、相关度和相似度等。

3.滑动窗口扫描:将模板图像在输入图像上以不同的位置进行滑动窗口扫描。

滑动窗口的大小通常与模板图像的大小相同。

4.计算相似度:对于每个滑动窗口的位置,计算输入图像中该窗口与模板图像之间的相似度。

相似度的计算方法取决于所选择的相似度度量方法。

5.选择最佳匹配:找到输入图像中与模板图像最相似的区域,即具有最高相似度的窗口位置。

6.输出结果:输出最佳匹配的位置或者将最佳匹配的区域标记在输入图像中。

优点和局限性模板匹配方法具有以下优点:•简单易用:实现起来相对简单,不需要复杂的算法或模型。

•实时性:模板匹配通常可以在实时性要求较高的应用场景下实时进行。

•鲁棒性:对于某些特定的图像特征,模板匹配具有很好的鲁棒性。

然而,模板匹配方法也存在一些局限性:•对光照、噪声等影响敏感:模板匹配对光照变化、噪声等影响非常敏感,可能导致匹配失败。

•复杂场景下效果有限:当背景复杂、目标物体的外观发生改变时,模板匹配的效果可能不理想。

•计算开销较大:对于大尺寸图像和大尺寸模板,模板匹配的计算开销相对较大。

应用领域模板匹配方法在计算机视觉领域有广泛的应用,包括但不限于以下几个方面:1.目标检测与跟踪:模板匹配可用于目标检测和跟踪,如人脸检测、车辆识别等。

模板匹配及其类型

模板匹配及其类型
《模板匹配及其类型》
模板匹配是一种在计算机领域中常用的技术,用于在大规模的数据中查找与特定模式或模板相似的项。

它的核心思想是通过比较待匹配的数据与已知的模板之间的相似度,来确定是否存在匹配。

1. 字符串匹配:这是最常见的模板匹配类型,用于在文本数据中查找与特定字符串模式匹配的项。

例如,在一个文本文件中查找特定的单词或短语。

2. 图像匹配:在计算机视觉领域,模板匹配用于在图像中查找与特定图像模式相似的区域。

它可以用于对象识别、目标跟踪等任务。

3. 数据挖掘:在数据挖掘中,可以使用模板匹配来发现数据集中的模式或规律。

例如,通过比较不同数据集的特征,可以找到相似的数据集或模式。

4. 音频和视频匹配:在音频和视频处理中,可以使用模板匹配来识别特定的音频或视频模式。

它可以用于语音识别、音乐识别、视频内容分析等任务。

5. 生物信息学:在生物信息学领域,模板匹配用于在生物序列中查找相似的模式。

例如,在基因序列分析中,可以使用模板匹配来查找特定的基因或蛋白质序列。

总的来说,模板匹配是一种通用的技术,可以应用于各种领域和任务。

它的关键在于定义合适的模板和相似度度量方法,以准确地识别和匹配数据中的模式。

谢谢大家!。

模板匹配算法原理

模板匹配算法原理
模板匹配算法是一种基于像素级别的图像识别方法。

该算法的原理是将一个小的图像(称为模板)与另一个较大的图像(称为源图像)进行比较,通过像素级别的比较来确定它们之间的相似度。

当源图像中存在与模板相似的图案或物体时,模板匹配算法可以将其检测出来。

模板匹配算法分为两种:基于像素的模板匹配算法和基于特征的模板匹配算法。

基于像素的模板匹配算法通过像素级别的比较来确定模板与源图像之间的相似度。

该算法的优点是速度快且适用于大尺寸的图像,但缺点是对光照和噪声比较敏感。

基于特征的模板匹配算法则是通过提取图像的特征来确定模板与源图像之间的相似度。

该算法的优点是对光照和噪声不敏感,但缺点是计算量比较大和对图像特征提取的精度要求较高。

模板匹配算法在实际应用中广泛使用,例如在医学图像识别、人脸识别、指纹识别、自动驾驶等领域。

在人脸识别中,模板匹配算法可以通过比较存储的人脸模板和实时摄像头捕捉到的人脸图像来确
定是否匹配。

在指纹识别中,模板匹配算法可以将指纹图像与已知指纹模板进行比较来进行指纹识别。

在自动驾驶中,模板匹配算法可以通过匹配道路标志来确定车辆所在的位置和行驶方向。

总之,模板匹配算法是一种有效的图像识别方法,具有广泛的应用前景。

- 1 -。

模板匹配与模式识别

佳特征子集。
这种方法不改变原始观测值的物理意义。
特征变换
就是将m个测量值的集合通过某种变换,产生n个特征
用于分类。
分两种情况:从减少原始特征之间相关性和浓缩性信
息量的角度出发。
另一种方法就是根据观测量所反映的物理现象与待分
类别之间的关系的认识,通过数学运算产生一组新的
特征值,使得待分类之间的差异在改组特征值里面更

T
这一误分类概率随T的位置而发生变化,在
位置上确定T时,PE最小,
P( w1 ) p( X | w1 ) P( w2 ) p( X | w2 )
特征矢量分布函数
使用最大似然法,需要预先求出
P( wi )和p( X | wi ),P( wi )是类别wi 被观测的概率,
因此可以预测;p( X | wi )是表示类别wi的特征
特征选择的方法:
✓ 穷举法:从m个测量值里面选取n个特征,然后对
每一种选法利用已经知道类别属性的样本进行试
分类,获得其正确率,分类误差最小的一组特征
便是最好的选择。
✓ 最大最小类对距离法:
基本思想 :从K个类别中选取最难分离的一对类别,
然后选择不同的特征子集,计算这一类别的可分性,
具有最大可分性的特征子集就是该方法所选择的最
2. 神经元的功能特性
➢ 时空整合功能。
➢ 神经元的动态极化性。
➢ 兴奋与抑制状态。
➢ 结构的可塑性。
➢ 脉冲与电位信号的转换。
➢ 突触延期和不应期。
➢ 学习、遗忘和疲劳。
人工神经网络研究的兴起与发展
•人工神经网络的研究大体上可分为四个阶段:
✓ 产生时期(20世纪50年代中期之前)
✓ 高潮时期(20世纪50年代中期到20世纪60年代末期

模板匹配详解

模板匹配¶目标¶在这节教程中您将学到:•使用OpenCV函数matchTemplate在模板块和输入图像之间寻找匹配,获得匹配结果图像•使用OpenCV函数minMaxLoc在给定的矩阵中寻找最大和最小值(包括它们的位置).原理¶什么是模板匹配?¶模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.它是怎么实现的?¶•我们需要2幅图像:1. 原图像(I):在这幅图像里,我们希望找到一块和模板匹配的区域2. 模板(T):将和原图像比照的图像块我们的目标是检测最匹配的区域:•为了确定匹配区域, 我们不得不滑动模板图像和原图像进行比较:•通过滑动, 我们的意思是图像块一次移动一个像素(从左往右,从上往下). 在每一个位置, 都进行一次度量计算来表明它是“好” 或“坏” 地与那个位置匹配(或者说块图像和原图像的特定区域有多么相似). •对于T覆盖在I上的每个位置,你把度量值保存到结果图像矩阵(R)中. 在R 中的每个位置都包含匹配度量值:上图就是TM_CCORR_NORMED方法处理后的结果图像R . 最白的位置代表最高的匹配. 正如您所见, 红色椭圆框住的位置很可能是结果图像矩阵中的最大数值,所以这个区域(以这个点为顶点,长宽和模板图像一样大小的矩阵) 被认为是匹配的.•实际上, 我们使用函数minMaxLoc来定位在矩阵R中的最大值点(或者最小值,根据函数输入的匹配参数) .OpenCV中支持哪些匹配算法?¶问得好. OpenCV通过函数matchTemplate实现了模板匹配算法. 可用的方法有6个:1. 平方差匹配method=CV_TM_SQDIFF这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.b. 标准平方差匹配method=CV_TM_SQDIFF_NORMEDc. 相关匹配method=CV_TM_CCORR这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.d. 标准相关匹配method=CV_TM_CCORR_NORMEDe. 相关匹配method=CV_TM_CCOEFF这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).在这里f. 标准相关匹配method=CV_TM_CCOEFF_NORMED通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价). 最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案.•在这程序实现了什么?o载入一幅输入图像和一幅模板图像块(template)o通过使用函数matchTemplate实现之前所述的6种匹配方法的任一个. 用户可以通过滑动条选取任何一种方法.o归一化匹配后的输出结果o定位最匹配的区域o用矩形标注最匹配的区域•下载代码: 单击这里•看一下代码:#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;/// 全局变量Mat img; Mat templ; Mat result;char* image_window ="Source Image";char* result_window ="Result window";int match_method;int max_Trackbar =5;/// 函数声明void MatchingMethod( int, void* );/** @主函数 */int main( int argc, char** argv ){/// 载入原图像和模板块img = imread( argv[1], 1 );templ = imread( argv[2], 1 );/// 创建窗口namedWindow( image_window, CV_WINDOW_AUTOSIZE );namedWindow( result_window, CV_WINDOW_AUTOSIZE );/// 创建滑动条char*trackbar_label ="Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED"; createTrackbar( trackbar_label, image_window, &match_method,max_Trackbar, MatchingMethod );MatchingMethod( 0, 0 );waitKey(0);return0;}/*** @函数 MatchingMethod* @简单的滑动条回调函数*/void MatchingMethod( int, void* ){/// 将被显示的原图像Mat img_display;img.copyTo( img_display );/// 创建输出结果的矩阵int result_cols = img.cols - templ.cols +1;int result_rows = img.rows - templ.rows +1;result.create( result_cols, result_rows, CV_32FC1 );/// 进行匹配和标准化matchTemplate( img, templ, result, match_method );normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );/// 通过函数 minMaxLoc 定位最匹配的位置double minVal; double maxVal; Point minLoc; Point maxLoc;Point matchLoc;minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );/// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好if( match_method == CV_TM_SQDIFF || match_method ==CV_TM_SQDIFF_NORMED ){ matchLoc = minLoc; }else{ matchLoc = maxLoc; }/// 让我看看您的最终结果rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );imshow( image_window, img_display );imshow( result_window, result );return;}1. 定义一些全局变量, 例如原图像(img), 模板图像(templ) 和结果图像(result) , 还有匹配方法以及窗口名称:2.Mat img; Mat templ; Mat result;3.char*image_window ="SourceImage";4.char*result_window ="Resultwindow";5.6.int match_method;7.int max_Trackbar =5;8. 载入原图像和匹配块:9.img = imread( argv[1], 1 );10.templ = imread( argv[2], 1 );11. 创建窗口,显示原图像和结果图像:dWindow( image_window,CV_WINDOW_AUTOSIZE );dWindow( result_window,CV_WINDOW_AUTOSIZE );14. 创建滑动条并输入将被使用的匹配方法.一旦滑动条发生改变,回调函数MatchingMethod就会被调用.15.char* trackbar_label ="Method:\n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";16.createTrackbar( trackbar_label,image_window, &match_method, max_Trackbar, MatchingMethod );17. 一直等待,直到用户退出这个程序.18.waitKey(0);19.return0;20. 让我们先看看回调函数. 首先, 它对原图像进行了一份复制:21.Mat img_display;22.img.copyTo( img_display );23. 然后, 它创建了一幅用来存放匹配结果的输出图像矩阵. 仔细看看输出矩阵的大小(它包含了所有可能的匹配位置)24.int result_cols =img.cols -templ.cols +1;25.int result_rows =img.rows -templ.rows +1;26.27.result.create( result_cols,result_rows, CV_32FC1 );28. 执行模板匹配操作:29.matchTemplate( img, templ,result, match_method );很自然地,参数是输入图像I, 模板图像T, 结果图像R还有匹配方法(通过滑动条给出)30. 我们对结果进行归一化:31.normalize( result, result, 0, 1,NORM_MINMAX, -1, Mat() );32. 通过使用函数minMaxLoc,我们确定结果矩阵R的最大值和最小值的位置.33.double minVal; double maxVal;Point minLoc; Point maxLoc;34.Point matchLoc;35.36.minMaxLoc( result, &minVal,&maxVal, &minLoc, &maxLoc, Mat() );函数中的参数有:o result:匹配结果矩阵o&minVal和&maxVal:在矩阵result中存储的最小值和最大值o&minLoc和&maxLoc:在结果矩阵中最小值和最大值的坐标.o Mat():可选的掩模37. 对于前二种方法( CV_SQDIFF 和CV_SQDIFF_NORMED ) 最低的数值标识最好的匹配. 对于其他的, 越大的数值代表越好的匹配. 所以, 我们在matchLoc中存放相符的变量值:38.if( match_method ==CV_TM_SQDIFF ||match_method ==CV_TM_SQDIFF_NORMED )39. { matchLoc = minLoc; }40.else41. { matchLoc = maxLoc; }42. 显示原图像和结果图像. 再用矩形框标注最符合的区域:43.rectangle( img_display, matchLoc,Point( matchLoc.x +templ.cols , matchLoc.y +templ.rows ), Scalar::all(0), 2, 8, 0 );44.rectangle( result, matchLoc,Point( matchLoc.x +templ.cols , matchLoc.y +templ.rows ), Scalar::all(0), 2, 8, 0 );45.46.imshow( image_window,img_display );47.imshow( result_window, result );1. 开始测试我们的程序,一幅输入图像:还有一幅模版图像:2. 产生了一下结果图像矩阵(第一行是标准的方法SQDIFF, CCORR 和CCOEFF, 第二行是相同的方法在进行标准化后的图像).在第1列, 最黑的部分代表最好的匹配, 对于其它2列, 越白的区域代表越好的匹配.3. 正确的匹配在下面显示(右侧被矩形标注的人脸). 需要注意的是方法CCORR 和CCOEFF 给出了错误的匹配结果, 但是它们的归一化版本给出了正确的结果, 这或许是由于我们实际上仅仅考虑“最匹配”而没考虑其他可能的高匹配位置.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

halcon模板匹配* 在一个图片中获取ROI并在此图片中匹配dev_close_window ()dev_open_window (0, 0, 600, 600, 'black', WindowHandle)* 窗口语句read_image(Image,'L:/Halcon test/mk2.jpg')*read_image(Image,'L:/Halcon test/mk3.jpg')*read_image(Image,'L:/Halcon test/mk4.jpg')* 这里有4张图片,每一张都说明一个小问题,附图分析。

gen_rectangle1 (ROI1, 57.8333, 49.5, 181.167, 342.833)* 画一个矩形选择ROI,矩形在左上角,覆盖一个完整的,无变形规定尺寸的商标,作为模板。

reduce_domain(Image,ROI1,ImageReduced1)* 大图和这个矩形的ROI相减就会得到一个左上角的商标的图案作为模板,命名ImageReduced。

create_shape_model(ImageReduced1,0,0,rad(360),0,'no_pregeneration','use_polarity',40,10,ModelID1)* 创建一个比例不变(1:1)的匹配的轮廓模型。

具体参数下个帖子说明,也可见[Halcon算子学习交流区] Halcon模版匹配算子解析。

find_shape_model(Image,ModelID1,0,rad(360),0.7,13,0.5,'interpolation',0,0.9,Row,Column,Angle,Score)* 寻找与模板的大小尺寸必须是一比一匹配的,只是角度的不同而已,若大小发生变化,则不能匹配get_shape_model_contours(ModelContours1,ModelID1,1)* 在大图中获取匹配。

for i := 0 to |Row|-1 by 1vector_angle_to_rigid(0,0,0,Row【i】,Column【i】,Angle【i】,HomMat2D)affine_trans_contour_xld(ModelContours2,ContoursAffinTrans,HomMat2D)endfor* 获取匹配。

disp_message (WindowHandle, '总共匹配了' + |Row| + '个商标', 'window', 12, 12, 'red', 'true')* 输出数量统计。

clear_shape_model(ModelID1)stop()[cpp]view plain copy1.create_shape_model(2.Template : : //reduce_domain后的模板图像3.NumLevels,//金字塔的层数,可设为“auto”或0—10的整数4.AngleStart,//模板旋转的起始角度5.AngleExtent,//模板旋转角度范围, >=06.AngleStep,//旋转角度的步长, >=0 and <=pi/167.Optimization,//设置模板优化和模板创建方法8.Metric, //匹配方法设置9.Contrast,//设置对比度10.MinContrast ://设置最小对比度11.ModelID ) //输出模板句柄1. NumLevels越大,找到匹配使用的时间就越小。

另外必须保证最高层的图像具有足够的信息(至少四个点)。

可以通过inspect_shape_model函数查看设置的结果。

如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数,如果最底层金字塔的信息太少,函数就会报错。

如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数。

如果金字塔的层数太大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。

如果金字塔层数太少找到模板的时间会增加。

可以先使用inspect_shape_model函数的输出结果来选择一个较好的金字塔层数。

2. 参数AngleStart、AngleExtent定义了模板可能发生旋转的范围。

注意模板在find_shape_model函数中只能找到这个范围内的匹配。

参数AngleStep定义了旋转角度范围内的步长。

如果在find_shape_model函数中没有指定亚像素精度,这个参数指定的精度是可以实现find_shape_mode函数中的角度的。

参数AngleStep的选择是基于目标的大小的,如果模板图像太小不能产生许多不同离散角度的图像,因此对于较小的模板图像AngleStep应该设置的比较大。

如果AngleExtent不是AngleStep的整数倍,将会相应的修改AngleStep。

如果选择complete pregeneration,不同角度的模板图像将会产生并保存在内存中。

用来存储模板的内存与旋转角度的数目和模板图像的的点数是成正比的。

因此,如果AngleStep太小或是AngleExtent太大, 将会出现该模型不再适合(虚拟)内存的情况。

在任何情况下,模型是完全适合主存储器的,因为这避免了操作系统的内存分页,使得寻找匹配模板的时间变短。

由于find_shape_model函数中的角度可以使用亚像素精度,一个直径小于200像素的模板可以选择AngleStep>= 1。

如果选择AngleStep='auto' (or 0 向后兼容),create_shape_model将会基于模板的大小自动定义一个合适的角度步长. 自动计算出来的AngleStep可以使用get_shape_model_params函数查看。

如果没有选择complete pregeneration, 该模型会在每一层金字塔上建立在一个参考的位置。

这样在find_shape_model 函数运行时,该模型必须转化为不同的角度和尺度在运行时在。

正因为如此,匹配该模型可能需要更多的时间。

3. 对于特别大的模板图像,将参数Optimization设置为不同于'none'的其他数值是非常有用的。

如果Optimization= 'none', 所有的模型点将要存储。

在其他情况下, 按照Optimization的数值会将模型的点数减少. 如果模型点数变少了,必须在find_shape_model函数中将参数Greediness设为一个比较小的值, 比如:0.7、0.8。

对于比较小的模型, 减少模型点数并不能提高搜索速度,因为这种情况下通常显着更多的潜在情况的模型必须进行检查。

如果Optimization设置为'auto',create_shape_model自动确定模型的点数。

Optimization的第二个值定义了模型是否进行预处理(pregenerated completely),是通过选择'pregeneration'或者'no_pregeneration'来设置的。

如果不使用第二个值(例如:仅仅设置了第一个值), 默认的是系统中的设置,是通过set_system('pregenerate _shape_models',...)来设置的,对于默认值是('pregenerate_shape_models' = 'false'), 模型没有进行预处理. 模型的预处理设置通常会导致比较低的运行时间,因为模型不需要在运行时间时转换。

然而在这种情况下,内存的要求和创建模板所需要的时间是比较高的。

还应该指出,不能指望这两个模式返回完全相同的结果,因为在运行时变换一定会导致变换模型和预处理变换模型之间不同的内部数据。

比如,如果模型没有completely pregenerated,在find_shape_model函数中通常返回一个较低的scores,这可能需要将MinScore设置成一个较低的值。

此外,在两个模型中插值法获得的位置可能略有不同。

如果希望是最高精确度,应该使用最小二乘调整得到模型位置。

4. 参数Contras决定着模型点的对比度。

对比度是用来测量目标与背景之间和目标不同部分之间局部的灰度值差异。

Contrast的选择应该确保模板中的主要特征用于模型中。

Contrast也可以是两个数值,这时模板使用近似edges_image 函数中滞后阈值的算法进行分割。

这里第一个数值是比较低的阈值,第二个数值是比较高的阈值。

Contrast也可以包含第三个,这个数值是在基于组件尺寸选择重要模型组件时所设置的阈值,比如,比指定的最小尺寸的点数还少的组件将被抑制。

这个最小尺寸的阈值会在每相邻的金字塔层之间除以2。

如果一个小的模型组件被抑制,但是不使用滞后阈值,然而在Contrast中必须指定三个数值,在这种情况下前两个数值设置成相同的数值。

这个参数的设置可以在inspect_shape_model函数中查看效果。

如果Contrast设置为'auto',create_shape_model将会自动确定三个上面描述的数值。

或者仅仅自动设置对比度('auto_contrast'),滞后阈值('auto_contrast_hyst')或是最小尺寸('auto_min_size')中一个。

其他没有自动设置的数值可以按照上面的格式再进行设置。

可以允许各种组合,例如:如果设置['auto_contrast','auto_min_size'],对比度和最小尺寸自动确定;如果设置['auto_min_size',20,30],最小尺寸会自动设定,而滞后阈值被设为20和30。

有时候可能对比度阈值自动设置的结果是不满意的,例如,由于一些具体应用的原因当某一个模型组件是被包含或是被抑制时,或是目标包含几种不同的对比度时,手动设置这些参数效果会更好。

因此对比度阈值可以使用determine_shape_model_params函数自动确定,也可以在调用create_shape_model之前使用inspect_shape_mode函数检查效果。

相关文档
最新文档