确定图像中是否存在已知字体(OCR + OpenCV)中的数字

时间:2018-08-15 05:39:05

标签: python python-2.7 opencv ocr tesseract

使用Python 2.7,我正在尝试识别playing cards上的数字。我已经弄清楚正在使用的字体(Herculanum),并创建了reference image个数字。一张图像中可能有多张不同角度的卡片(例如,上下颠倒),并且可能overlap。最终,颜色将发挥作用,但我想首先确定数字。

理想情况下,我想知道数字的存在以及它在图像中的位置。我尝试了一些使用pytesseract和OpenCV的方法。我也正在训练TensorFlow神经网络,但是我认为这似乎是一个简单的问题,这太过分了。我有一些代码可以读取参考数字,但是我正努力将其绑定到示例卡片图像上。

from imutils import contours
import numpy as np
import imutils
import cv2

ref = cv2.imread('ocr_a_reference.png')
ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)[1]

refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, 
cv2.CHAIN_APPROX_SIMPLE)
refCnts = refCnts[0] if imutils.is_cv2() else refCnts[1]
refCnts = contours.sort_contours(refCnts, method="left-to-right")[0]
digits = {}

for (i, c) in enumerate(refCnts):
    # compute the bounding box for the digit, extract it, and resize
    # it to a fixed size
    (x, y, w, h) = cv2.boundingRect(c)
    roi = ref[y:y + h, x:x + w]
    roi = cv2.resize(roi, (57, 88))

    # update the digits dictionary, mapping the digit name to the ROI
    digits[i] = roi

是否可以从已知字体中识别图像中的匹配数字?这几乎就像在更大的图像中搜索图像以找到最匹配的图像。理想的最终输出将是数字列表和图像中的计数。 pytesseract和/或OpenCV是否可能?还是我应该看看另一个图书馆?

谢谢您的建议!

1 个答案:

答案 0 :(得分:0)

您可以使用tesseract遍历已识别的单词并获取每个单词的边界框,但是您将面临以下挑战:

  • 方向:虽然可以将tesseract配置为自动检测 方向,您的图像针对不同的方向有多个方向 包含数字的卡片。
  • 重复:您在同一张卡上会看到两次相同的数字,一次只能看到一次 其他人,如果他们被其他卡所隐藏。

您可能可以使用的一种方法是,您可以为卡多次旋转生成卡中使用的字体的参考数字,例如:每10个降级...因此,每个字符将有36个参考图像和360。您现在可以在此模型上训练tesseract。另外,我注意到您的卡为黑色,仅用于数字和边框。您可以对图像进行预处理,以去除剩余的背景色,以提高准确性。.如果旋转10度后效果不佳,则可能必须重新尝试不同的角度。对于重复问题,一旦所有数字都具有边界框,并且知道给定卡中的数字与其相对的对具有固定的距离。您可以使用此信息删除所有重复项。