为什么 Tesseract OCR 库(iOS)完全不能识别文本?

24

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

enter image description here

我得到了无法阅读的文本:

  

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]);

这是我的项目结构:

enter image description here

我通过引用添加了英文testdata文件夹。那么我做错了什么?我该如何解决?


你从哪里获取图像,它是你的应用程序包的一部分,由应用程序从网站下载还是来自相机? - Adam Richardson
@AdamRichardson 我使用来自相机和应用程序包的图像。结果仍然相同。 - MainstreamDeveloper00
2
你尝试过不加入 [tesseractObject setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"] 吗?因为我代码里没有这个。 - Adam Richardson
@AdamRichardson 谢谢朋友:)它真的帮了我很大的忙。我删除了这段内容,所有的文本都被准确识别了。但这真的很奇怪...将字符限制在特定集合中必须只能提高识别准确性。现在我一点也不明白事情的原因了。 - MainstreamDeveloper00
1
也许你应该再试一次,但这次在白名单中包括小写字母... - Anders Johansen
显示剩余4条评论
5个回答

21

您正在使用选项tessedit_char_whitelist,其值为“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”,这将限制字符识别仅限于此列表。但是,您要处理的图像包含小写字符,如果要使用此选项,则还必须包括小写字符。

[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];

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/


我在配置Tesseract时使用了这个教程。所以你有什么解决方法吗?我真的需要帮助。谢谢。 - MainstreamDeveloper00
你应该使用Pod,这样Pod就会负责更新任何需要更新的文件。 - GeneCode

12

就像Adam所说,如果你想要好的结果,你需要进行一些图像处理并配置一些设置(例如白名单特定字符等)。

对于任何其他遇到这个问题的人,我已经制作了一个样本项目,在这里进行了一些白名单和图像处理:https://github.com/mstrchrstphr/OCR-iOS-Example


在构建设置中的架构下,删除默认值并添加armv7和armv7s。 这个库没有针对arm64进行构建,这可能是你遇到错误的原因。 - Boaz Saragossi
如果出现链接器错误,则使用"TesseractOCR.framework"。 - Ramani Hitesh

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
}

以下三个步骤将帮助您将Tesseract的准确度提高到60%至70%


我使用上述3个步骤从tesseract得到了70%的准确率文本结果。但是,我想从这个文本中获取像地址、名字、姓氏这样的文本检测。 - Sujatha Girijala

0

enter image description here

我的输出是

enter image description here

解决方案:

 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 点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接