模板匹配是我们最常用的工具之一,它的参数对结果影响很大,所以,理解这些参数的含义之后,在项目里调节这些参数就能事半功倍。
灵闪里的模板匹配工具的底层和LPV这个SDK是共享的,所以,不管是灵闪中的模板匹配工具,还是LPV中的LMatch对象的参数,都可以以LPV文档中的内容为准。
LPV在线文档中的模板匹配对象的链接地址是 https://lpv.intelliblink.com/2.x/cn/html/interface_l_p_v_pat_lib_1_1_i_l_match.html#details
用于筛选匹配结果的最小匹配分数 (int AcceptScore),取值在 1~100 的范围。分数越高表示匹配标准越严格。
模板匹配的搜索过程中,包含粗匹配和精匹配。粗匹配过程会基于快速但近似计算的分数来从图上过滤出需要精匹配的位置。进入精匹配之后,会依次优化每个位置的坐标、角度和缩放比例等参数到亚像素精度。
在粗匹配和精匹配的过程中,都遵循一个分数贪婪原则,在能够满足其他所有要求(例如重叠度和缺失比例)的前提下,若达到用户设定的最小匹配分数之后,就尽快结束搜索。也因此,如果存在多个候选位置时,且最小匹配分数设定过低,搜索过程可能会因为次优解已经达到最小匹配分数要求而直接被输出为最终匹配位置。
因此,在能够匹配到目标的前提下,尽量提高最小匹配分数是推荐的调参策略。
最大匹配数量 (int MaxCount):期望的最大匹配数量。
角度范围的中心偏移 (int AngleBias):角度范围的中心偏离0°的大小,取值范围-180~180,单位是°,默认是0。
角度范围 (int AngleTolerance): 以中心偏移为基准的角度范围,取值范围0~180,单位是°,默认为5。
举例:
尺寸缩放范围的中心偏移 (int ScaleBias):尺寸缩放范围的中心比例,取值范围50~150,单位是%,默认值为100,即尺寸缩放范围的中心值和模板的尺寸相同。
尺寸缩放范围 (int ScaleTolerance):以中心偏移为基准的缩放范围,取值范围0~50,单位是%,数值大小代表范围的半宽度,默认值为0,即默认尺寸和模板保持一致不能改变。
保持长宽比 (bool IsotropicScale):待搜索的目标的长宽比是否和模板保持一致,默认为true,表示长宽比需要和模板保持一致。
举例:
精度等级 (int AccuraceyLevel):更高的精度意味着更高的亚像素精度,以及更慢的速度,取值可为:0(低精度),1(中等精度,默认值)或者 2(高精度)。
当设置为高精度时,从粗匹配的时候开始,其参数搜索的基础步长会更小,精度更高,所以,高精度和中等精度相比,可能会搜索出全新的更相似的目标。类似的,设置为中等精度时,粗匹配的步长也会比低精度更小。
当需要更高的重复精度,同时又能接受匹配速度减小时,推荐将精度等级提得更高。
是否启用严格评分 (bool StrictScore):是否启用严格评分功,默认为false,即不启用。若启用严格评分,匹配结果的分数将基于原始图像和所有特征细节(即精匹配阶段)计算。否则,分数可能在缩小并平滑后的图像上(即粗匹配阶段)计算,该过程更快速但相比前者考虑更少细节。
若存在整体相似,但细节存在差异的易混淆目标(即用户不期望匹配上,但整体看起来相似的目标)时,应当优先考虑启用严格评分(StricScore = true)。
是否在匹配过程中使用缓存 (bool UseCache):开启后可以加快匹配,但占用更多内存,默认开启。匹配效果没有区别,所以一般情况下都建议开启,除非模板(例如4k*5k的模板图)很大,同时包含很细的特征(例如细细长长的十字),且用户的PC机内存容量较小,期望降低内存占用。
匹配结果之间的最大重叠比例 (int Overlap):当MaxCount大于1,且有匹配到多个目标的时候,就可能存在多个目标重叠的情况,该参数就表示两两之间允许的最大重叠比例。若两两之间的重叠比例超出这个参数的数值,则分数较低的那个目标会被丢弃。
该参数取值范围在 1~80 之间,单位是%,默认设置为 50,表示 50% 的重叠比例。推荐的取值在 30 ~ 70 附近。
注:当MaxCount=1时,该参数无效。
融合两种匹配分数时的权重值(int GrayValueWeight):用于融合基于形状相似性的匹配分数和基于灰度特征(NCC)的匹配分数,实际代表的是灰度匹配分数对应的权重,取值范围0~100,单位是%。
不同取值对应实际执行的搜索算法:
以上三种不同的权重取值范围虽然对应不同的匹配算法,但是,只要权重不是0或1,匹配的评分数值都是形状和灰度两种评分的加权求和得到的。
大部分情况下,因为形状匹配总是比灰度匹配快,所以我们总是先尝试用形状匹配,也就是默认的GrayValueWeight=0。
若存在易混淆目标,例如,其形状相似,训练得到的特征之外的像素灰度值存在显著差异,这时就需要启用灰度匹配,将GrayValueWeight设定为超过0.7的值,完全依赖灰度匹配进行测试,若结果依旧不佳,再考虑在0.3~0.7之间调节GrayValueWeight,此时,速度是最慢的。
缺失部分是否对匹配评分有负面影响 (bool IgnoreMissing):若IgnoreMissing=true(默认值),则在计算分数时,会忽略当前图像上缺失的模板特征,这些缺失的部分只是对分数的累计没有贡献,不会有减分,同时也不考虑缺失比例的大小。若IgnoreMissing=false,则计算分数时,缺失的部分会进一步减小总分,即会有减分,同时,还会计算缺失特征数占总特征数的比例,若超过缺失比例的阈值,则会丢弃这个匹配位置。
是否在匹配过程中忽略边缘极性 (bool IgnorePolarity):在模板训练时,会提取特征,每个特征都会包含局部的形状信息和灰度信息,其中,形状信息中的边缘极性是一种重要的信息,它代表了跨越轮廓时的灰度变化方向。而忽略极性的意思就是,忽略这种灰度变化方向,其默认值为false。
例如,白色背景上摆放着一个没有旋转角度的黑色方块,其上横边中点附近的局部灰度变化方向就是朝下的。若将这个场景改成黑色背景上摆放着一个没有旋转角度的白色方块,则上横边中点附近的局部灰度变化方向就是朝上的。在启用忽略极性时,用白色背景黑色方块创建的模板,就可以匹配到黑色背景上的白色方块,反之,则无法匹配。
通常,都不会去启用忽略极性参数(即IgnorePolarity=false),除非,待匹配目标的轮廓因为凹凸的变化或者打光方向的变化,而发生了极性变化,则需要忽略极性(IgnorePolarity=true)。而且,通常忽略极性之后,误匹配到易混淆目标的风险会提高。
匹配时使用的对比度阈值 (int NoiseThreshold):用于避免噪声像素参与匹配。取值范围为 0 ~ 100,默认设置为 0。默认值0是一个基于模板图像的梯度分布训练获得的很低的噪声阈值,对于 8 位图像而言相当于 10 ~ 15 的灰阶差,可以通俗地理解成灰阶差小于15的特征,会被丢弃,不参与搜索和评分。
实际使用时,若出现误匹配到易混淆目标时,可以观察一下,在新的图上,模板的特征匹配到位置附近的像素是否对比度较低,如果是的话,就可以通过调大对比度阈值来降低这个易混淆目标的匹配分数,最终实现丢弃这个目标。
模板细节程度 (double DetailLevel):取值范围为 0 ~ 1,默认设置为 0.5。该参数仅影响模板学习过程,不影响后续的匹配过程。模板细节程度数值越高,保留的细节越多,同时也可能引入更多的噪声,并影响算法的整体性能。 设置或修改模板细节程度后,需重新调用 Learn() 训练模板,特征点将在新的训练过程中按照细节程度重新提取。