python - 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 语句来确定某事确实在那个时候匹配,并执行在找到某事后应该执行的程序。
!编辑!为了消除误解,我不需要检测到的对象的位置或绘图,我只需要一个布尔值来判断是否找到了某物
解决方案
如果要获取图像中最突出的匹配,可以使用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
推荐阅读
- node.js - 为什么我的 http 响应在我的请求负载的开头添加了 undefined?
- oracle-apex - Oracle Apex 中间表插入
- oracle - Oracle PL/SQL 匿名块在修改为过程后停止工作
- openssl - 使用应用程序打包 OpenSSL
- chart.js - Chartjs 中 xAxes 的错误显示
- dart - 收听 ModalBottomSheet 关闭
- javascript - 如何为这些嵌套的 HTML 列表正确生成数据结构
- python - 使用数据框进行 Python 复杂操作
- elasticsearch - 不了解 _id 在 ES 上的行为
- c++ - Constexpr 替代放置 new 以使内存中的对象未初始化?