首页 文章

OpenCV模板匹配True / False

提问于
浏览
1

所以我不知道从 Headers 中是否容易理解,但我的问题与OpenCV模板匹配有关,当程序可以说'找到模板'并返回while循环的布尔值 . P.S我知道保存图像并一直删除它是非常低效的,但它确实有效

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

然后拉链位置的点就是绘制匹配的位置 .

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

所以我的问题是,在什么时候我可以使用if语句来确定某些内容确实在那一点上匹配并执行应该在找到某些内容之后的程序 .

!编辑!为了清除误解,我不需要检测到的对象的位置和图形,我只需要一个布尔值来告诉是否找到了某些东西

2 回答

  • 0

    如果要获得图像中最突出的匹配,可以使用 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)
    

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

    enter image description here

    编辑

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

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

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

    在我看来,在“pt”坐标的第一个巧合 . 尝试测试变量,无论它是否为空 .

    flag = False
    for pt in zip(*loc[::-1]):
        if pt is not None:
            flag = True
        cv2.rectangle(screen, pt, (pt[0] + w, pt[1] + h),(0,255,0) , 2)
    

相关问题