数字识别的建议

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

在这里输入图像描述

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

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

    我有三个问题:

  • 有什么办法可以克服Tesseract的局限性吗?
  • 如果不是,那么检测个别数字(不是k-最近的邻居)在Android上可行的有效而准确的方法 - 这可能是一个免费的图书馆或DIY解决方案。
  • 我如何改进预处理以达到该方法? 我考虑的一种可能性是使用细化算法,正如本文所建议的那样,但是我不打算去实施它,除非它会有所作为。

  • 我参加了一个计算机视觉超级明星的课,他们是数字识别算法排名的顶端。 他确实坚信数字识别的最佳方式是......

    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库都应该完成这项工作...... OpenCV自带的CvSVM应该没问题。

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

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


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

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

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

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

    链接地址: http://www.djcxy.com/p/79643.html

    上一篇: Suggestions for digit recognition

    下一篇: Image recognition of well defined but changing angle image