用openCV和python检测图像中的图案和数字

2024-05-01 08:03:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个程序,可以输入一个图像(我是通过PIL的imageGrab来完成的),并检测其中一些已知的符号及其位置。好在我很确定我不需要神经网络,因为我知道每个符号的确切形状和大小。问题是我不知道这些会有多少,以及每个符号的背景颜色是什么。有些符号是数字,我有一个图像的每个数字0-9,但可能有多达3位数的数字。我想我可以找到一种方法,通过它们的位置来知道哪个数字是同一个数字的一部分,但我们稍后再讨论。现在,我已经将图像转换成灰度,并使用opencv2显示它。在

你知道我怎么用opencv做吗?其他图书馆? 我需要它足够快,希望每秒10帧。在

这是我当前的代码(修改后的sentdex's "python plays GTA" code,页面最底部):

import numpy as np
from PIL import ImageGrab
import cv2

def screen_record(): 
    while(True):

        global printscreen

        image = ImageGrab.grab(bbox=(20,270,430,685))
        printscreen = np.array(image)
        grayscale_image = cv2.cvtColor(printscreen, cv2.COLOR_BGR2GRAY)

        cv2.imshow('window', grayscale_image)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break
        if cv2.waitKey(25) & 0xFF == ord('w'):
            image.save("screen_shot.png")
            print("Saved current window as image")

screen_record()

编辑:我设法得到了一些与opencv的模板匹配,只有数字2(目前)。我找到了一个不错的教程here。我的问题是当没有一个完全匹配的模板,意味着没有数字2s,或大于1。当没有任何一个时,它看起来像是在图像上随机选择一些东西,当有多个时,我只检测到其中一个。用不同的方式来满足我的需要,有可能吗?在


Tags: 图像imageimportpilasnp符号数字
1条回答
网友
1楼 · 发布于 2024-05-01 08:03:08

所以,我有办法解决我的问题。 对于将来访问此页面以获取帮助的所有人,以下是对图像中的模板进行重新组织的步骤:

创建两个图像,一个是您要检测的,另一个是您的模板。 然后,使用opencv上传您想要的任何人,并复制以下函数:

def locate_symbol(x, template):
    w, h = filter_num2.shape[::-1]

    res = cv2.matchTemplate(x, template, cv2.TM_SQDIFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    min_thresh = 0.45
    match_locations = np.where(res<=min_thresh)

    return w, h, match_locations

并使用这些线在图像上绘制边界框:

^{pr2}$

然后你可以用cv2.imshow()绘制所有的东西

相关问题 更多 >