我正在尝试编写一个程序,可以输入一张图像(我使用PIL的imageGrab来实现),并检测其中一些已知的符号及其位置。好消息是我几乎可以肯定我不需要使用神经网络,因为我知道每个符号的确切形状和大小。问题是我不知道这些符号会有多少,以及每个符号背景的颜色是什么。其中一些符号是数字,我有每一位数字0到9的图像,但可能有三位数的数字。我认为我可以通过它们的位置找到一种方法来确定哪些数字属于同一个数字,但我们稍后再讨论这个问题。现在,我已经将图像转换为灰度并使用opencv2的imshow显示它。
你有任何关于如何使用opencv来实现的想法吗?还是其他库?我需要它足够快,希望能达到每秒10帧的速度。
这是我当前的代码(修改自sentdex的“python玩GTA”代码,页面最底部):
import numpy as npfrom PIL import ImageGrabimport cv2def 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。我找到了一篇不错的教程这里。我的问题是当模板的匹配结果不正好是1个时,即没有数字2,或者多于1个时。当没有匹配时,看起来它会在图像上随机选择某个位置,而当有多个匹配时,我只能检测到其中一个。是否有可能以不同的方式应用它来满足我的需求?
回答:
所以,我找到了解决我的问题的方案。对于所有将来访问此页面寻求帮助的人,这里是识别图像中模板的步骤:
创建两张图像,一张是你想要检测的图像,另一张是你的模板。然后,使用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
然后使用这些行在图像上绘制边界框:
w, h, locs = locate_symbol(grayscale_image, filter_num2)for (x, y) in zip(locs[1], locs[0]): cv2.rectangle(printable_image, (x, y), (x+w, y+h), [255, 0, 0], 2)
然后你可以使用cv2.imshow()来显示所有内容