24

我正在尝试Tesseract OCR在我的 iOS 应用程序中使用库。我从 github 下载了 tesseract-ios 库,当我试图识别一个简单的文本图像时,我得到了垃圾。这是我试图识别的图像:

在此处输入图像描述

我收到不可读的文字:

T0I1101T0W KIR1 H1I1101T0W KIR1 H1I1101T0W CIBEPS H1 ES PBHY P306 EHH11 133I R1 11335 11I1H1 19 13S SYIL 3B19 M H300H1911 H1113 AIR1 J1 OIII 3I9SH5H133IS 13V9 I1 Q1H211 E015 19 W331 H1 111SW

为什么 Tesseract 甚至无法识别简单的图像?这是我用来实例化 Tesseract 的代码:

Tesseract* tesseractObject = [[Tesseract alloc] initWithDataPath:@"tessdata" language:@"eng"];
[tesseractObject setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
[tesseractObject setImage:image];
[tesseractObject recognize];
NSLog(@"RECOGNISED= %@" , [tesseractObject recognizedText]);

这是我的项目结构:

在此处输入图像描述

我通过引用添加了英文 testdata 文件夹。那么我做错了什么?我怎样才能解决这个问题?

4

5 回答 5

21

您使用的选项 tessedit_char_whitelist 的值为“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”,它将字符识别限制在此列表中。但是,您要处理的图像包含小写字符,如果要使用此选项,您也必须包含小写字符。

[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
于 2013-11-11T08:50:03.877 回答
19

确保您拥有来自 Google 代码的最新 tessdata 文件

http://code.google.com/p/tesseract-ocr/downloads/list

这将为您提供一个 tessdata 文件列表,如果您还没有下载这些文件并包含在您的应用程序中的话。在您的情况下,您将需要 tesseract-ocr-3.02.eng.tar.gz 因为您正在寻找英语文件

以下文章将向您展示需要安装它的位置。我在构建第一个 Tesseract 项目时通读了本教程,发现它非常有用

http://lois.di-qual.net/blog/install-and-use-tesseract-on-ios-with-tesseract-ios/

于 2013-06-18T13:25:53.560 回答
12

就像亚当说的那样,如果你想要好的结果,你必须做一些图像处理和配置一些设置(将某些字符列入白名单等)。

对于其他偶然发现这个问题的人,我在这里整理了一个示例项目,该项目进行了一些白名单和图像处理:https ://github.com/mstrchrstphr/OCR-iOS-Example

于 2013-06-22T06:00:47.920 回答
0

在此处输入图像描述

我的输出是

在此处输入图像描述

解决方案 :

 tesseract.language = @"eng+fra";

tesseract.pageSegmentationMode = G8PageSegmentationModeAuto;
tesseract.engineMode  = G8OCREngineModeTesseractCubeCombined;
tesseract.image = [image.image g8_blackAndWhite];

tesseract.maximumRecognitionTime = 60.0;
[tesseract recognize];

NSLog(@"%@", tesseract.recognizedText);

reco_area.text = [tesseract recognizedText];

对于 tessdata 点击这里

于 2016-11-08T08:29:14.113 回答
0

@Adam Richardson 解释的任何内容都是正确的,以及添加此 1)用于增加图像大小的 scaleimage 方法(尺寸增加)

func scaleImage(image: UIImage, maxDimension: CGFloat) -> UIImage {

    var scaledSize = CGSize(width: maxDimension, height: maxDimension)
    var scaleFactor: CGFloat

    if image.size.width > image.size.height {
        scaleFactor = image.size.height / image.size.width
        scaledSize.width = maxDimension
        scaledSize.height = scaledSize.width * scaleFactor
    } else {
        scaleFactor = image.size.width / image.size.height
        scaledSize.height = maxDimension
        scaledSize.width = scaledSize.height * scaleFactor
    }

    UIGraphicsBeginImageContext(scaledSize)
    image.draw(in: CGRect(x: 0, y: 0, width: scaledSize.width, height: scaledSize.height))
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return scaledImage!
}

2) 将此 eng.traineddata 语言文件存储在文件管理器中

 func storeLanguageFile() throws{
    var fileManager: FileManager = FileManager.default
    let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
    let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
    let docDirectory = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)[0] as NSString
    let path: String = docDirectory.appendingPathComponent("/tessdata/eng.traineddata")
    if fileManager.fileExists(atPath: path){
        var data: NSData = NSData.dataWithContentsOfMappedFile((Bundle.main.resourcePath?.appending("/tessdata/eng.traineddata"))!)! as! NSData
        var error: NSError
        try FileManager.default.createDirectory(atPath: docDirectory.appendingPathComponent("/tessdata"), withIntermediateDirectories: true, attributes: nil)
        data.write(toFile: path, atomically: true)
    }
}

3) 之后您可以使用https://github.com/BradLarson/GPUImage提高图像的清晰度

你可以用这个

func preprocessedImage(for tesseract: G8Tesseract!, sourceImage: UIImage!) -> UIImage! {
    var stillImageFilter: GPUImageAdaptiveThresholdFilter = GPUImageAdaptiveThresholdFilter()
    stillImageFilter.blurRadiusInPixels = 4.0
    var filterImage: UIImage = stillImageFilter.image(byFilteringImage: sourceImage)
    return filterImage
}

这 3 个步骤将帮助您将 tesseract 的准确率提高到 60 ~ 70 %

于 2016-12-21T06:49:27.940 回答