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

使用openCV和python检测图像中的图案和数字,python,opencv,machine-learning,computer-vision,Python,Opencv,Machine Learning,Computer Vision,我试图创建一个程序,可以输入一个图像(我是通过PIL的imageGrab来实现的),并检测其中的一些已知符号及其位置。好的是我很确定我不需要神经网络,因为我知道每个符号的确切形状和大小。问题是,我不知道其中有多少,每个符号的背景颜色是什么。有些符号是数字,我有一个图像,每个数字0-9,但可能有多达3位数字。我想我能够找到一种方法,通过它们的位置来知道哪些数字是同一个数字的一部分,但让我们稍后再讨论。现在,我已经将图像转换为灰度,并使用opencv2显示它 你知道我怎样用opencv来做吗?其他图

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

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

这是我当前的代码(已修改,位于页面最底部):


编辑:我设法与opencv的模板匹配,只是数字2(目前)。我找到了一本不错的教程。我的问题是当模板不完全匹配时,意味着没有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

然后您可以使用cv2.imshow()绘制所有内容。

一些示例图像会有很大帮助吗?
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)