数字识别的建议

时间:2012-11-10 05:59:04

标签: android image-processing opencv ocr tesseract

我正在编写一个Android应用来从图片中提取数独谜题。对于9x9 Sudoku网格中的每个单元格,我需要确定它是否包含数字1到9之一或是空白。我从像这样的Sudoku开始:

enter image description here

我使用OpenCV对Sudoku进行预处理,以提取各个数字的黑白图像,然后将它们放入Tesseract。但是,Tesseract有一些限制:

  1. Tesseract很大,包含许多我不需要的功能(即全文识别),需要英语培训数据才能运行,我认为必须进入设备的SD卡。至少我可以告诉它只使用tesseract.setVariable("tessedit_char_whitelist", "123456789");
  2. 查找数字
  3. Tesseract经常将单个数字误解为一串数字,通常包含换行符。它有时也只是简单地弄错了。以下是上述数独的几个例子:
  4. enter image description here

    我有三个问题:

    1. 有什么方法可以克服Tesseract的限制吗?
    2. 如果没有,有什么有用的,准确的方法来检测在Android上可行的个别数字(不是k-最近邻居) - 这可能是一个免费的库或DIY解决方案
    3. 如何改进预处理以定位该方法?我考虑过的一种可能性是使用稀疏算法,正如this post所建议的那样,但我不打算去实施它,除非它会产生影响。

2 个答案:

答案 0 :(得分:11)

我参加了一个有one计算机视觉超级巨星的课程,他们在数字识别算法排名中名列前茅。他非常坚定认为数字识别的最佳方式是......

1. Get some hand-labeled training data.
2. Run Histogram of Oriented Gradients (HOG) on the training data, and produce one
    long, concatenated feature vector per image
3. Feed each image's HOG features and its label into an SVM
4. For test data (digits on a sudoku puzzle), run HOG on the digits, then ask 
    the SVM classify the HOG features from the sudoku puzzle

OpenCV有一个HOGDescriptor对象,用于计算HOG features。请查看this paper以获取有关如何调整HOG功能参数的建议。任何SVM库都应该完成这项工作...... CvSVM stuff that comes with OpenCV应该没问题。

对于训练数据,我建议使用MNIST handwritten digit database,其中包含数千张带有地面实况数据的数字图片。

一个稍微难点的问题是在自然界中出现的数字周围绘制一个边界框。幸运的是,看起来你已经找到了制作边界框的策略。 :)

答案 1 :(得分:1)

最简单的方法是使用标准化中心矩进行数字识别。 如果您有一种字体(或非常相似的字体,它可以很好地工作)。

查看此解决方案: https://github.com/grzesiu/Sudoku-GUI

在核心中,有一些东西负责数字识别,提取,时刻训练。 第一次运行应用程序运营商必须提供信息的数量。然后将图像的时刻(提取的方形roi)分配给数字(操作员输入)。应用基于比较时刻。

首先,YouTube电影会显示应用程序的工作原理: http://synergia.pwr.wroc.pl/2012/06/22/irb-komunikacja-pc/