IOSアプリケーションでTesseract OCR
ライブラリを使用しようとしています。私はgithubからtesseract-iosライブラリをダウンロードしましたが、単純なテキスト画像を認識しようとすると、代わりにゴミが入りました。ここに私が認識しようとしたものの画像があります:
判読できないテキストが表示されました:
T1
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フォルダーを参照で追加しました。それで、私は何が間違っていますか?どうすれば修正できますか?
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/
値tessedit_char_whitelistを値 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"で使用しているため、文字認識がこのリストのみに制限されます。ただし、処理するイメージには小文字が含まれます。このオプションを使用する場合は、小文字のcharも含める必要があります。
[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
Adamが言ったように、良い結果が必要な場合は、画像処理と設定(特定の文字のホワイトリスト登録など)を行う必要があります。
この質問に出くわした人のために、ホワイトリストと画像処理を行うsample projectをここにまとめました: https ://github.com/mstrchrstphr/OCR-iOS-Example
アダム・リチャードソンが説明したものは何でも、これを追加することで正しい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つの手順は、テセラクトの精度を最大60〜70%向上させるのに役立ちます。
私の出力は
解決 :
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の場合 ここをクリック