【问题标题】:Why Tesseract OCR library (iOS) cannot recognize text at all?为什么 Tesseract OCR 库(iOS)根本无法识别文本?
【发布时间】:2013-06-14 16:24:23
【问题描述】:

我正在尝试在我的 iOS 应用程序中使用 Tesseract OCR 库。我从 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 文件夹。那么我做错了什么?我该如何解决这个问题?

【问题讨论】:

  • 您是否包含所有 eng tessdata 文件,因为您的语言文件在扫描和获取字母形状时似乎无法正常工作
  • @AdamRichardson 请查看我的编辑。
  • 您从哪里获取图像,它是您的应用程序包的一部分,是由应用程序从网站下载的,还是从相机中下载的?
  • 你试过没有 [tesseractObject setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];因为那是我的代码中没有的东西
  • 也许你应该再试一次,但这次在白名单中包含小写字母...

标签: ios objective-c ocr tesseract


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    确保您拥有来自 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 时使用了本教程。所以你不知道如何解决这个问题吗?我真的需要帮助。谢谢
    • 你应该使用 pod,这样 pod 会处理所有需要更新的文件。
    【解决方案3】:

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

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

    【讨论】:

    • @user3823935 在架构下的构建设置中删除默认值并添加 armv7 和 armv7s。这个库不是针对 arm64 构建的,这可能就是你得到错误的原因
    • 如果链接器出错则使用“TesseractOCR.framework”使用
    【解决方案4】:

    我的输出是

    解决方案:

     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 click here

    【讨论】:

      【解决方案5】:

      @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 %

      【讨论】:

      • 通过使用上述 3 个步骤,我从 tesseract 获得了 70% 准确度的文本结果。但是,我想从此文本中获取地址、名字、姓氏等文本检测
      猜你喜欢
      • 2021-03-11
      • 1970-01-01
      • 2015-01-13
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2011-07-25
      相关资源
      最近更新 更多