1

在花费了 10 多个小时使用 libc++ 编译 tesseract 以便它与 OpenCV 一起使用之后,我在获得任何有意义的结果时遇到了问题。我正在尝试将其用于数字识别,我传递的图像数据是一个小正方形 (50x50) 图像,其中有一个或没有数字。

我试过同时使用 eng 和 equ tessdata (来自谷歌代码),结果不同,但都得到猜测 0 位。使用 eng 数据我得到'4\n\n''\n\n'作为大多数时间的结果(即使图像中没有数字),置信度在 1 到 99 之间。使用 equ 数据我得到'\n\n'置信度为 0-4。

我还尝试对图像进行二值化,结果或多或少相同,但我认为不需要它,因为图像被过滤得很好。

我假设有问题,因为与最简单的示例图像相比,这些图像很容易识别。

这是代码:

初始化:

    _tess = new TessBaseAPI();
    _tess->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], "eng");
    _tess->SetVariable("tessedit_char_whitelist", "0123456789");
    _tess->SetVariable("classify_bln_numeric_mode", "1");

认出:

char *text = _tess->TesseractRect(imageData, (int)bytes_per_pixel, (int)bytes_per_line, 0, 0, (int)imageSize.width, (int)imageSize.height);

我没有错误。TESSDATA_PREFIX 设置正确,我尝试了不同的识别方法。检查时 imageData 看起来没问题。

以下是一些示例图像:

http://imgur.com/a/Kg8ar

这应该与常规训练数据一起使用吗?

感谢任何帮助,我第一次尝试 tessarect,我可能错过了一些东西。

编辑:

我发现了这个:

    _tess->SetPageSegMode(PSM_SINGLE_CHAR);

我假设它必须在这种情况下使用,尝试过但得到了相同的结果。

4

1 回答 1

1

我认为 Tesseract 对于这些东西来说有点矫枉过正。您最好使用一个简单的神经网络,为您的图像明确训练。在我的公司,最近我们尝试在 iOS 上使用 Tesseract 来执行 OCR 任务(用相机扫描水电费),但它对于我们的目的来说太慢且不准确(在 iPhone 4 上扫描耗时超过 30 秒,低帧率)。最后,我专门为我们的目标字体训练了一个神经网络,这个解决方案不仅击败了 Tesseract(它甚至可以在 iPhone 3G 上完美地扫描内容),而且还击败了商业 ABBYY OCR 引擎,我们得到了一个样本从公司。 本课程的材料将是机器学习的良好开端。

于 2013-11-07T23:13:46.910 回答