iOSで日本語OCR!サンプルアプリ構築編〜iOS SDK 6.1 + tesseract-ocr 3.02〜
前回に引き続き今回は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-iosはtesseract-ocrを使うためのC++のソースコードをラップしてObjective-Cから扱いやすくしてくれます。 tesseract-iosはldiqual/tesseract-ios · GitHubからダウンロードできます。 tesseract-iosをダウンロードしたら、プロジェクトナビゲータの適当な場所で「右クリック>Add Files to "TesseractOCRSample"...」を実行してファイルを追加しておきましょう。
プロジェクトの設定
プロジェクトナビゲータよりプロジェクトを選択し「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」を選択しなければなりませんので注意してください。
サンプルコード
ここまできたらあとはソースコードを書くだけです。 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
サンプルで使用する画像は以下のものになるので、ダウンロードしてプロジェクトに追加してください。
サンプルアプリの実行
これで準備完了です。実行してみましょう。
実行結果
ギャル文字みたいなものがw
まとめ
まだ私がtesseract-ocrの使い方を熟知してないせいか、実行結果を見る限りまだ実用できそうにないかもしれません。いずれにしてもこういった技術がオープンソースとして利用できるのは本当にすごいですね。精度上げることができれば次回もやりたいと思います!