web-dev-qa-db-ja.com

Tesseract OCRライブラリ(iOS)がテキストをまったく認識できないのはなぜですか?

IOSアプリケーションでTesseract OCRライブラリを使用しようとしています。私はgithubからtesseract-iosライブラリをダウンロードしましたが、単純なテキスト画像を認識しようとすると、代わりにゴミが入りました。ここに私が認識しようとしたものの画像があります:

enter image description here

判読できないテキストが表示されました:

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

プロジェクトの構造は次のとおりです。

enter image description here

英語のtestdataフォルダーを参照で追加しました。それで、私は何が間違っていますか?どうすれば修正できますか?

24

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/

19
Adam Richardson

値tessedit_char_whitelistを値 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"で使用しているため、文字認識がこのリストのみに制限されます。ただし、処理するイメージには小文字が含まれます。このオプションを使用する場合は、小文字のcharも含める必要があります。

[tesseractObject setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" forKey:@"tessedit_char_whitelist"];
21
Médéric Petit

Adamが言ったように、良い結果が必要な場合は、画像処理と設定(特定の文字のホワイトリスト登録など)を行う必要があります。

この質問に出くわした人のために、ホワイトリストと画像処理を行うsample projectをここにまとめました: https ://github.com/mstrchrstphr/OCR-iOS-Example

12
Christopher

アダム・リチャードソンが説明したものは何でも、これを追加することで正しい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%向上させるのに役立ちます。

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の場合 ここをクリック

0
Deepak Kumar