Я решал аналогичную проблему на bskyb с OCRing кадрами, взятыми из видеопотока.
В итоге я создал словарь координат для каждой цифры в изображении (x,y, w, h)
и написал скрипт, который генерировалсотни этих цифр и сохранили их как маски.Затем один из тестировщиков выбрал лучшие маски (наименее искаженные) и сохранил их как 1.bmp для цифры 1, 2.bmb для цифры 2 ...
Нам нужно было создать 18 разных изображений для каждойцифра для поддержки различных разрешений, у нас есть aspect_ratios.Затем эти маски были загружены в словарь в начале процесса распознавания.Мы сохранили изображения в виде массива.
def load_samples(parent_dir=r'c:\masks'):
"""Loads the OCR samples of all digits of all possible variations into
memory.
"""
m = dict() # m is our map, a dict of lists of numpy arrays
for d in os.listdir(parent_dir):
if not os.path.isdir(os.path.join(parent_dir, d)):
continue
m[d] = []
for i in range(10): # 10 images [0..9]
filename = os.path.join(parent_dir, d, '%d.bmp'%i)
m[d].append(imread(filename))
return m
Затем для каждого считываемого изображения мы делим его на цифры путем преобразования цифры в массив с нулями и сравнения ее со всеми масками, которые мы должны найти.ближайшее совпадение и выберите его на основе этого.digits_map - это то, что возвращается из описанных выше примеров загрузки.
def image2digit(image, digits_map, video_args):
"""Our home made OCR, we compare each image of digit with 10 images of all
possible digits [0..10] and return the closest match.
"""
def absdiff(img1, img2):
func = numpy.vectorize(lambda a, b: abs(int(a)-int(b)))
v = func(img1, img2)
w = coordinates[video_args]['w']
h = coordinates[video_args]['h']
return numpy.sum(v)/(w*h) # takes the average
# convert the image to a numpy array
image_array = fromimage(image) # from scipy.misc
# compare it with all variations
scores = []
for (i, ir) in enumerate(digits_map[video_args]):
scores.append(absdiff(ir, image_array))
# return the best match as a string
index = numpy.argmin(scores)
return str(index)
Это хорошо сработало для нас, за исключением некоторых искаженных кадров, где 6 обозначено как 5. Я экспериментирую с преобразованием изображений в шкалу серого перед сравнениемчтобы увидеть, помогает ли это с проблемой искаженных изображений.