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

lstz6jyr  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(224)

我使用模板匹配来搜索具有多个示例的对象。
我指的是www.example.com上的教程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)来获得置信度,但是如何针对多个示例中的每个匹配来实现这一点呢?
输入图像示例:

范例模板:

sh7euo9m

sh7euo9m1#

res“变量包含图像中所有点的置信度,但靠近右边界和下边界的点除外。点的置信度表示左上角位于该点且宽度和高度与模板图像的宽度和高度相同的矩形的置信度。
因此,要获得找到的每个匹配的置信度,请在for循环中添加一行:

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

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

相关问题