我正在尝试在我的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文件夹。那么我做错了什么?我该如何解决这个问题?
答案 0 :(得分:21)
您正在使用选项tessedit_char_whitelist,其值为“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”,它仅将字符识别限制为此列表。但是,您要处理的图像包含小写字符,如果要使用此选项,则必须包含小写字母char。
[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
答案 1 :(得分: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/
答案 2 :(得分:12)
就像亚当说的那样,如果你想要好的结果,你将不得不做一些图像处理并配置一些设置(白名单列出某些字符等)。
对于任何绊倒这个问题的人,我在这里整理了一个示例项目,它会进行一些白名单和图像处理:https://github.com/mstrchrstphr/OCR-iOS-Example
答案 3 :(得分: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 click here
答案 4 :(得分:0)
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个步骤将帮助您将tesseract的准确度提高到60~70%