使用 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) 来获得置信度,但是如何为多个实例中的每个匹配做到这一点呢?

示例输入图像:

input mario

示例模板: template

stack overflow Get confidence of template matching for object with multiple instances by using cv2.TM_CCOEFF_NORMED
原文答案
author avatar

接受的答案

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

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

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

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


答案:

相关问题