为什么Tesseract OCR库(iOS)根本无法识别文本?

我正在尝试在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文件夹。 那么我做错了什么? 我怎样才能解决这个问题?

确保你有谷歌代码最新的tessdata文件

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

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

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

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

您正在使用tessedit_char_whitelist选项,其值为“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”,仅限于将字符识别限制在此列表中。 然而,你想要处理的图像包含小写字符,如果你想使用这个选项,你将不得不包含小写字母。

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

就像亚当说的,如果你想得到好的结果,你将不得不做一些image processing和configuration一些设置(白名单某些字符等)。

对于任何人都在这个问题上磕磕绊绊,我已经在这里做了一个示例项目 ,做一些白名单和image processing: https : //github.com/mstrchrstphr/OCR-iOS-Example

您可以使用ABBYY Cloud OCR Sdk识别图像中的文本, 而不使用Tesseract OCR库。 我已经尝试在我的应用程序,它的工作完美。 您可以尝试使用此链接演示示例: https : //github.com/abbyysdk/ocrsdk.com/tree/master/iOS/OcrSdkDemo

这些信息对所有人都是有帮助的。

在这里输入图像说明

和我的输出是

在这里输入图像说明

解答:

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

无论@亚当·理查森解释是正确的,加上这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语言文件存储在filemanager中

  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个步骤将帮助您将测量精度提高到60〜70%