数字识别的建议

1''*_*1'' 14 ocr android opencv tesseract image-processing

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

在此输入图像描述

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

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

在此输入图像描述

我有三个问题:

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

sol*_*les 11

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

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
Run Code Online (Sandbox Code Playgroud)

OpenCV有一个HOGDescriptor对象,它可以计算HOG功能.请看本文为咨询如何调整你的HOG特征参数.任何SVM库都应该完成这项工作...... CvSVMOpenCV附带东西应该没问题.

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

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