数字识别的建议

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

在此处输入图像描述

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

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

在此处输入图像描述

我有三个问题:

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

我和其中一位计算机视觉超级巨星一起上了课,他们在数字识别算法排名中名列前茅。 他非常坚定认为,做数字识别的最佳方法是……

 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对象,它可以计算HOGfunction 。 请参阅本文以获取有关如何调整HOGfunction参数的建议。 任何SVM库都应该完成这项工作…… OpenCV附带的CvSVM应该没问题。

对于训练数据,我建议使用MNIST手写数字数据库 ,该数据库有数千张带有地面实况数据的数字图片。

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

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

请参阅此解决方案: https //github.com/grzesiu/Sudoku-GUI

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

这里的第一部YouTube电影展示了应用程序的工作原理: http //synergia.pwr.wroc.pl/2012/06/22/irb-komunikacja-pc/