我正在尝试创建一个可以输入图像的程序(我通过ImageGrab从PIL执行)并检测其中的一些已知符号及其位置。好的是我很确定我不需要神经网络,因为我知道每个符号的确切形状和大小。问题是我不知道这些中有多少,每个符号背景的颜色是什么。一些符号是数字,我有一个每个数字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。我的问题是当模板没有完全匹配时,意味着没有数字2,或者更多然后1.当没有任何它看起来像它在图像上随机选择一些东西时,当有多于一个时,我有只检测到其中一个。是否可以以不同的方式应用它以满足我的需求?
所以,我有一个解决我的问题的方法。对于将来访问此页面以获取帮助的所有人,以下是在图像中重新标识模板的步骤:
创建2个图像,您要检测的图像,另一个图像用于模板。然后,使用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()绘制所有内容