16

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

在此处输入图像描述

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

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

在此处输入图像描述

我有三个问题:

  1. 有什么办法可以克服 Tesseract 的限制吗?
  2. 如果不是,那么在 Android 上可行的检测单个数字(不是 k 最近邻)的有用、准确的方法是什么——这可以是免费库或 DIY 解决方案。
  3. 如何改进预处理以针对该方法?正如这篇文章所建议的,我考虑过的一种可能性是使用细化算法,但我不会费心去实现它,除非它会有所作为。
4

2 回答 2

12

我和一位曾经/现在位居数字识别算法排名榜首的计算机视觉超级明星一起上课。他非常坚持认为进行数字识别的最佳方法是......

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 特征的对象。查看本文以获取有关如何调整 HOG 功能参数的建议。任何 SVM 库都应该完成这项工作…… CvSVMOpenCV 附带的东西应该没问题。

对于训练数据,我推荐使用MNIST 手写数字数据库,它有数千张带有真实数据的数字图片。

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

于 2012-11-10T06:21:08.617 回答
1

最简单的事情是使用归一化中心矩进行数字识别。如果您有一种字体(或非常相似的字体,效果很好)。

看到这个解决方案: https ://github.com/grzesiu/Sudoku-GUI

核心部分负责数字识别、提取、时刻训练。首次运行应用程序时,操作员必须提供看到的数字信息。然后将图像的矩(提取的平方 roi)分配给数字(操作员输入)。基于比较矩的应用。

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

于 2012-11-10T09:35:35.217 回答