OpenCV图像编号识别

时间:2018-10-20 00:02:08

标签: python opencv

enter image description here enter image description here enter image description here

对不起,英语不好。我想做一个条件,左角有12的图像=右角有12的图像和!= 21的图像。

我需要一种快速的方法来确定这一点,因为有很多照片并且它们会刷新。

我尝试使用计数特定图像的像素:

result = np.count_nonzero(np.all(original > (0,0,0), axis=2))

(为什么我使用>(0,0,0)而不是==(255,255,255)?白色符号附近有灰色阴影,眼睛看不到)

这种方式看不到12和21之间的区别。

我尝试了第二种方法,将新图像与模板进行比较,但是发现在左上角和右上角之间有12到12个巨大的差异!

original = ('auto/5or.png' )
template= cv2.imread( 'auto/5t.png' )
res = cv2.matchTemplate( original, template, cv2.TM_CCOEFF_NORMED )

我还没有尝试确定数字的一些困难方法,因为我认为-即使在我的小照片上,这也太慢了。 (我可能会误会)。

我的数字只有0到30,我有所有的模板,示例,它们仅在黑色正方形内的位置有所不同。

有什么想法吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

如果您不希望图像中数字的位置有所不同,则可以将图像阈值设置为黑白,然后找到边界框并对其进行裁剪,以便数字始终位于同一位置-然后只需改变图像或使用您之前使用过的内容即可:

#!/usr/local/bin/python3

import numpy as np
from PIL import Image

# Open image, greyscale and threshold
im=np.array(Image.open('21.png').convert('L'))

# Mask of white pixels
mask = im.copy()
mask[mask<128]  = 0     # Threshold pixels < 128 down to black

# Coordinates of white pixels
coords = np.argwhere(mask)

# Bounding box of white pixels
x0, y0 = coords.min(axis=0)
x1, y1 = coords.max(axis=0) + 1

# Crop to bbox
cropped = im[x0:x1, y0:y1]

# Save
Image.fromarray(cropped).save('result.png')

这给你这个:

enter image description here

显然也可以裁剪模板图像。


我对Python中的 OpenCV 不太熟悉,但是看起来像这样:

import cv2
# Load image
img = cv2.imread('21.png',0)

# Threshold at 127
ret,thresh = cv2.threshold(img,127,255,0)

# Get contours
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# Get bounding box
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)