我正在编写一个Android应用来从图片中提取数独谜题。对于9x9 Sudoku网格中的每个单元格,我需要确定它是否包含数字1到9之一或是空白。我从像这样的Sudoku开始:
我使用OpenCV对Sudoku进行预处理,以提取各个数字的黑白图像,然后将它们放入Tesseract。但是,Tesseract有一些限制:
tesseract.setVariable("tessedit_char_whitelist", "123456789");
我有三个问题:
答案 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/