你好,归来的勇士(图像匹配)

好几个月没有写了,这次我们借地下城与勇士简单介绍下图片匹配吧。

这个技术能干什么,大家都明白,嘿嘿嘿~

这次的技术实现很简单,主要是各种python库的安装很麻烦,没办法,就是这样子。

方便起见,安装anaconda3吧,我安装的是python3-32位版本的,为什么我64位的机子要装32位呢,后面再告诉你,嘿嘿嘿~本文的话装32/64都可以,没有什么区别

安装anaconda3是因为我们要import cv2这个库,而这个库呢,安起来挺麻烦的,所以有人就统统打包起来作为anaconda3,这样我们就简单的安装了cv2。当然,anaconda3的功能不仅仅是这么简单,我们这里就不细说了。

这里是anaconda3下载链接,选择一个版本Downloads,包比较大,因为里面打包了很多很多东西......

对了,安装好以后最好简单看看怎么用,比如配置环境变量啦之类的,在运行脚本前试一下import cv2能不能成功导入。

下面是全部的代码

import cv2
import numpy as np


def mathc_img(image, Target, value):
    import cv2
    import numpy as np
    img_rgb = cv2.imread(image)
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template = cv2.imread(Target, 0)
    w, h = template.shape[::-1]
    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

    threshold = value
    loc = np.where(res >= threshold)
    # print(loc)
    # print(len(loc[0]))
    if len(loc[0]):
        print("匹配到人物")
        for pt in zip(*loc[::-1]):
            # cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (7, 249, 151), 2)
            cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (7, 249, 151), 2)
        cv2.imshow('Detected', img_rgb)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        return True
    else:
        print("没有匹配到人物")
        return False


if __name__ == '__main__':
    Target = 'role_1.jpg'
    image = "DNF_temp.jpg"
    value = 0.9
    mathc_img(image, Target, value)

我来简单粗暴的解释下

mathc_img(image, Target, value)这个函数,你不用看懂。image是大图片,也就是屏幕或者窗口的截图,Target是我们想要寻找的图片,value可以理解为匹配度,这个值可以调整,以便你来确定匹配的精度。在后面我做了一个简单的判断,如果匹配到了返回True,匹配失败返回False。至于其他的,可以看这里,有比较详细的说明Template Matching,不想看英文就复制粘贴到谷歌翻译,也没啥特别难的。

我的role_1.jpg是下图:

dnf_1

DNF_temp.jpg是下图:

dnf_2

匹配结果:

dnf_3

矩形框内位匹配结果。

想知道匹配点的左边,把我注释掉了的两个print恢复就好了。

至于为什么选用32位的,因为我要模拟键盘点击呀~