首页 > 解决方案 > OpenCV 模板匹配真/假

问题描述

所以我不知道从标题中是否容易理解,但我的问题与 OpenCV 模板匹配有关,以及程序何时可以说“找到模板”并为 while 循环返回布尔值。PS我知道保存图像并一直删除它效率很低,但它有效

import cv2
import numpy as np
from PIL import ImageGrab
import os

原始图像功能只是将 Pil 图像转换为 opencv 可以使用的东西的一种方法

def originalImages():
    screenPart = ImageGrab.grab(bbox=(900,40,1030,105))
    screenPart.save('CurrentFrame.jpg','JPEG')
    screen = cv2.imread('CurrentFrame.jpg', 0)
    cv2.imshow('screen',screen)
    os.remove('CurrentFrame.jpg')
    return screen

screen = originalImages()
res = cv2.matchTemplate(screen, template_img, cv2.TM_CCOEFF_NORMED)
loc = np.where(res>=0.8) #0.8 is the threshold

然后在 zip 位置中的点,只是在它匹配的位置绘制。

for pt in zip(*loc[::-1]):
    cv2.rectangle(screen, pt, (pt[0] + w, pt[1] + h),(0,255,0) , 2)

所以我的问题是,在什么时候我可以使用 if 语句来确定某事确实在那个时候匹配,并执行在找到某事后应该执行的程序。

!编辑!为了消除误解,我不需要检测到的对象的位置或绘图,我只需要一个布尔值来判断是否找到了某物

标签: pythonopencvboolean

解决方案


如果要获取图像中最突出的匹配,可以使用cv2.minMaxLoc()函数获取显示最大匹配的位置:

res = cv2.matchTemplate(screen, template_img, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc(res)

top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)

cv2.rectangle(screen, top_left, bottom_right, (0, 255, 0), 2)
cv2.imshow('Result', screen)   

期望的结果将是具有最高匹配的区域周围的边界框,如下所示:

在此处输入图像描述

编辑

基于查询,我们的想法是获得一个布尔结果来决定是否找到匹配项。如果结果中的任何值超过阈值,您可以设置阈值并设置标志。

对于上述情况,我将阈值设置为 0.8:

threshold = 0.8
flag = False
for i in res:
    if i.any() > threshold:
        flag = True

推荐阅读