【发布时间】:2021-10-12 01:08:21
【问题描述】:
我正在使用 OpenCV2 来处理游戏的自动阻止功能,所以很简单: 如果特定区域中显示的红色指示器的 max_val 高于阈值,请按指定的键以阻止该攻击。
有一个带有透明背景的指标模板,它适用于少数屏幕截图,但不适用于大多数其他屏幕截图。
这是我正在使用的数据:
模板:
检测代码:
import time
import cv2
import pyautogui
import numpy as np
def block_left():
# while True:
# screenshot = pyautogui.screenshot(region=(960, 455, 300, 260))
# region = cv2.imread(np.array(screenshot), cv2.IMREAD_UNCHANGED)
region = cv2.imread('Screenshots/Left S 1.png', cv2.IMREAD_UNCHANGED)
block = cv2.imread(r'Block Images/Left Block.png', cv2.IMREAD_UNCHANGED)
matched = cv2.matchTemplate(region, block, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(matched)
print(max_val)
w = block.shape[1]
h = block.shape[0]
cv2.rectangle(region, max_loc, (max_loc[0] + w, max_loc[1] + h), (255, 0, 0), 2)
cv2.imshow('Region', region)
cv2.waitKey()
block_left()
因此,总而言之,我尝试了多种其他方法,但都显示出不太成功的结果。是否有任何过滤器,我可以添加任何处理来解决这个问题? 谢谢。
上传的图片是8位的,但是使用的图片是32位的,但是由于大小无法上传,使用的32位图片在这里上传:https://ibb.co/r7B7G6Bhttps://ibb.co/r0r9w5Thttps://ibb.co/KXP3wWc
【问题讨论】:
-
您需要在模板中制作红色区域的遮罩,然后在 matchTemplate() 中使用遮罩。请参阅使用蒙版图像的文档。阅读模板图像,使其保留您的 Alpha 通道。然后提取alpha通道作为mask,提取alpha通道下的BGR图像。然后在 matchTemplate() 中使用 BGR 图像作为模板和掩码。
-
我刚刚尝试制作了模板的掩码,将其添加到模板中并使用了它,但结果仍然相同,或者我可能犯了一个错误,因为我对 OpenCV 还比较陌生跨度>
-
显示您的新代码以及您如何阅读模板并提取掩码和 matchTemplate 代码。
-
试试 TM_SQDIFF 和 min_loc
-
请注意,模板匹配既不是缩放不变的,也不是旋转不变的。对我来说,两张图片中红色形状的角度似乎略有不同。
标签: python python-3.x opencv image-processing opencv-python