首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV2 matchTemplate无法处理具有相同模板的不同图片

OpenCV2 matchTemplate无法处理具有相同模板的不同图片
EN

Stack Overflow用户
提问于 2021-08-07 14:49:14
回答 1查看 84关注 0票数 0

我正在使用OpenCV2来开发游戏的自动拦截功能,所以很简单:如果在特定区域显示的红色指示器的max_val高于阈值,则按指定的键来阻止该攻击。

有一个具有透明背景的指示器模板,它可以在少数屏幕截图上工作,但不能用于大多数其他屏幕截图。

下面是我使用的数据:

模板:

它成功检测到的屏幕截图:

无法检测到的屏幕截图:

要检测的代码:

代码语言:javascript
运行
复制
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/r7B7G6B https://ibb.co/r0r9w5T https://ibb.co/KXP3wWc

EN

Stack Overflow用户

回答已采纳

发布于 2021-08-07 17:48:46

以下是在Python/OpenCV中使用两个图像和带有alpha通道的模板进行遮罩模板匹配的示例。

图1:

图2:

模板:

代码语言:javascript
运行
复制
import cv2
import numpy as np

# read  image
img = cv2.imread('game2.jpg')

# read template with alpha channel
template_with_alpha = cv2.imread('game_template.png', cv2.IMREAD_UNCHANGED)
hh, ww = template_with_alpha.shape[:2]

# extract base template image and alpha channel and make alpha 3 channels
template = template_with_alpha[:,:,0:3]
alpha = template_with_alpha[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])

# do masked template matching and save correlation image
correlation = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED, mask=alpha)

# get best match
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(correlation)
max_val_corr = '{:.6f}'.format(max_val)
print("correlation score: " + max_val_corr)
print("match location:", max_loc)

# draw match 
result = img.copy()
cv2.rectangle(result, (max_loc), ( max_loc[0]+ww,  max_loc[1]+hh), (0,0,255), 1)

# save results
cv2.imwrite('game2_matches.jpg', result)

cv2.imshow('template',template)
cv2.imshow('alpha',alpha)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

与图像1匹配:

代码语言:javascript
运行
复制
correlation score: 0.983882
match location: (783, 512)

与图像2匹配:

代码语言:javascript
运行
复制
correlation score: 0.938928
match location: (867, 504)

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68693430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档