我在opencv和模板匹配方面遇到了一些麻烦,所以我希望有人可以帮助失去灵魂。
因此,作为我正在使用的代码的一部分,我已经得到了以下两行,我不太了解我应该这样做。
result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)
(_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)
根据我的理解,第一行在变量" result"中存储相关系数。这反过来又被传递到cv2.minMaxLoc(...)
,后者又生成一个由(minVal,maxVal,minLoc,maxLoc)组成的4元素数组,我们只对maxVal和maxLoc感兴趣。
在打印maxVal的值时,我似乎得到的值在2,000,000到7,000,000之间,具体取决于模板,光照条件等。
我的问题如下:
maxVal是什么意思?
maxVal的范围是什么?
哪些物理特性会影响maxVal的值?
提前感谢您的所有帮助和指导!
答案 0 :(得分:1)
理想情况下,cv2.matchTemplate
会返回相关性图,基本上是灰度图像,其中每个像素表示该像素的邻域与模板匹配的程度。
您建议我们仅对maxLoc
和maxVal
感兴趣并且这不是真的,它取决于您在匹配模板时考虑的相关类型。
现在,对于您的问题,minMaxLoc
函数会返回Mat
或array
中的最大和最小强度值以及这些强度的位置。
MaxVal 表示matchTemplate
返回的图像中强度最高的位置,它对应于图像w.r.t中的最佳匹配。到您的模板(仅针对特定关联方法,对于 TM_SQDIFF 或 TM_SQDIFF_NORMED ,最佳匹配将是minVal
)。
由于matchTemplate
返回的图像是灰度的,因此范围应该取决于原始图像,所以2000000到7000000对我来说有点不合适。
唯一的物理特征"影响maxVal
的应该是模板与图像的相关程度,而不是其他任何内容。
希望它有所帮助!
答案 1 :(得分:0)
如果您裁剪与模板最匹配的图像区域,则互相关函数的峰值为
np.sum(cropped * template)
当图像更亮,模板更亮以及模板更大时,此值将变大。
答案 2 :(得分:0)
正如其他答案已经解释的那样,您正在基于互相关进行匹配。因此maxVal是互相关的最大值。很难对范围进行一般性猜测。但是您始终可以将范围限制为[0, 1]
,
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());