使用 cv2.TM_CCOEFF_NORMED 获取具有多个实例的对象的模板匹配置信度

Get confidence of template matching for object with multiple instances by using cv2.TM_CCOEFF_NORMED

我正在使用模板匹配来搜索具有多个实例的对象。

我指的是 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html#template-matching-with-multiple-objects

中的教程

这是我目前使用的代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite('res.png',img_rgb)

在这里,他们使用 np.where(res>=threshold) 过滤置信度大于给定阈值的元素。

我应该如何修改代码以获得在 loc 中找到的每个匹配项的置信度值? 所以我想要的理想结果是这样的

for match in matches:
   x,y,w,h,confidence=match
   print(x,y,w,h,confidence)

在单个实例的模板匹配中,我们可以使用cv2.minMaxLoc(res)来获得置信度,但是对于多个实例中的每个匹配如何做到这一点?

示例输入图像:

示例模板:

答案就在你面前

“res”变量包含图像中除靠近右边界和底部边界的点之外的所有点的置信度。 Confidence of a point是指左上角在该点的矩形的置信度,其宽度和高度与模板图像的宽度和高度相同。

因此,为了获得找到的每个匹配项的置信度,在 for 循环内,添加一行:

confidence = res[pt[1]][pt[0]]

“置信度”变量将包含该匹配项的置信度。