iOSで日本語OCR!サンプルアプリ構築編〜iOS SDK 6.1 + tesseract-ocr 3.02〜

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回に引き続き今回はiOS SDK6.1用にビルドしたtesseract-ocr3.02を使用してサンプルアプリを作ってみましょう。

ちなみに今回は以下の環境を前提に説明します。

Mac OS X 10.8 Moutain lion
Xcode 4.6.2
iOS SDK 6.1
iPhone 5

いちいち手を動かすのが面倒な人は今回作成するサンプルアプリのXcodeプロジェクトをGithubにあげておきますのでそちらを見てみてください。
hirai-yuki/TesseractOCRSample

プロジェクトの作成

まずは、XcodeよりSingle View Applicationを選択し、以下の内容でプロジェクトを作成しましょう。

項目 設定値
Product Name TesseractOCRSample
Organization Name 自分の名前(サンプルなのでテキトー)
Company Identifier 会社名(サンプルなのでテキトー)
Class Prefix なし
Devices iPhone
Use Storyboards チェックする(ストーリーボードを使用)
Use Automatic Reference Counting チェックする(ARC有効)
Include Unit Tests チェックしない(unit testのターゲットを含まない)

tesseract-ocrのインポート

プロジェクトを作成したら早速前回作成したライブラリをインポートします。プロジェクトにインポートするのはtesseract-iOS6.1-buildディレクトリにあるdependenciesディレクトリです。プロジェクトナビゲータの適当な場所で「右クリック>Add Files to "TesseractOCRSample"...」を実行し、tesseract-iOS6.1-build/dependenciesディレクトリを選択してください。

tesseract Objective-Cラッパー「tesseract-ios」のインポート

tesseract-ocrはC++で書かれているため、そのまま使うとビューコントローラなどのソースコードでObjective-CとC++が混在してしまい面倒です。 tesseract-iostesseract-ocrを使うためのC++のソースコードをラップしてObjective-Cから扱いやすくしてくれます。 tesseract-iosldiqual/tesseract-ios · GitHubからダウンロードできます。 tesseract-iosをダウンロードしたら、プロジェクトナビゲータの適当な場所で「右クリック>Add Files to "TesseractOCRSample"...」を実行してファイルを追加しておきましょう。

ios-tesseract-2-1

プロジェクトの設定

プロジェクトナビゲータよりプロジェクトを選択し「Build Settings」を開き、以下の設定を変更しましょう。

項目 設定値
C++ Language Dialect Compiler Default
C++ Standard Library Compiler Default

言語ファイルのインポート

tesseract-ocrの使用する言語ファイルをプロジェクトにインポートします。今回は日本語を使用するので、tesseract-ocr-3.02.jpn.tar.gzをダウンロードします。他の言語を使いたい場合は、Downloads - tesseract-ocrより必要な言語ファイルをダウンロードしておきましょう。

tesseract-ocr-3.02.jpn.tar.gzを解凍すると、解凍してできたディレクトリの中にtessdataディレクトリがあるので、このディレクトリをプロジェクトにインポートします。プロジェクトナビゲータの適当な場所で「右クリック>Add Files to "TesseractOCRSample"...」を実行してtessdataディレクトリを追加するのですが、このとき、Foldersオプションで「Create folder references for any added folders」を選択しなければなりませんので注意してください。

ios-tesseract-2-2

サンプルコード

ここまできたらあとはソースコードを書くだけです。 ViewController.mを以下のように変更しましょう。

ViewController.m
#import "ViewController.h"
#import "Tesseract.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // OCRを実行する画像を表示しておく
    self.imageView.image = [UIImage imageNamed:@"tesseract_sample"];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    // OCR実行
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 日本語を設定
        Tesseract *tesseract = [[Tesseract alloc] initWithDataPath:@"tessdata" language:@"jpn"];
        
        // OCRを実行する画像を設定
        [tesseract setImage:self.imageView.image];
        
        // OCR実行!
        [tesseract recognize];
        
        // 実行結果をアラートビューで表示
        dispatch_async(dispatch_get_main_queue(), ^{
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
            [[[UIAlertView alloc] initWithTitle:@"Tesseract Sample"
                                        message:[NSString stringWithFormat:@"Recognized:\n%@", [tesseract recognizedText]]
                                       delegate:nil
                              cancelButtonTitle:nil
                              otherButtonTitles:@"OK", nil] show];
        });
    });
}

@end

サンプルで使用する画像は以下のものになるので、ダウンロードしてプロジェクトに追加してください。

tesseract_sample

サンプルアプリの実行

これで準備完了です。実行してみましょう。

実行結果

ios-tesseract-2-3

ギャル文字みたいなものがw

まとめ

まだ私がtesseract-ocrの使い方を熟知してないせいか、実行結果を見る限りまだ実用できそうにないかもしれません。いずれにしてもこういった技術がオープンソースとして利用できるのは本当にすごいですね。精度上げることができれば次回もやりたいと思います!