画像認識ライブラリv2は、iOS と Android に対応したフレームワークです。 本ライブラリを利用すると、画像認識機能を簡単にアプリへ組み込むことができます。  

特徴

  • わずか十数行のコードで、カメラを用いた画像認識を実装することができます。
  • 被写体の回転、スケール、多少のゆがみを考慮した画像認識が行えます。
  • カメラ以外から入力した画像に対しても画像認識を行うことができます。
  • 画像認識に必要な特徴量データを生成する Mac アプリケーションが付属しています。
 

v1との違い

「認識器」のしくみを追加しました。 高速な画像認識を重視するか、高精度な画像認識を重視するかで、 目的に応じて使い分けることが可能になりました。  

認識物について

本ライブラリは、平面上に形や模様などの特徴があるものを対象としています。 ポスター、パッケージ、写真、雑誌の表紙などが該当します。 ※一部の交通標識など、形や模様に複雑性のないものは正常に認識できない場合があります。  

動作確認環境

本ライブラリは以下の環境で動作確認を行っています。
  • iOS
    • iOS 6.x ~ 8.0.2 (ARC 対応)
    • Xcode 6.0.1
    • OpenCV 2.4.9
  • Android
    • Android 2.2以上
    • OpenCV 2.4.1
 

インストール手順(iOS)

本ライブラリの利用は、下記の手順で行います。

・事前準備

このページより本ライブラリをダウンロードしてください。 また本ライブラリは OpenCV を使用しています。 こちらのサイトより、本ライブラリに対応したバージョンの “OpenCV2 framework for iOS” をダウンロードしてください。

・Xcode プロジェクトの作成と設定

Xcode で iOS プロジェクトを新規作成します。 プロジェクト設定の Build Settings タブを選択し、以下の設定を行います。
項目名 設定値
Other Linker Flags -ObjC
続いて Build Phases タブを選択し、Link Binary With Libraries に以下のフレームワークを追加します。
  • GPImageRecognitionEngine.framework : 本ライブラリ
  • opencv2.framework : OpenCV
  • AVFoundation.framework
  • UIKit.framework
  • CoreGraphics.framework
  • CoreMedia.framework
  • CoreVideo.framework
  • QuartzCore.framework
  • AssetLibrary.framework
 

実装例

以下に ViewController に画像認識機能を組み込む例を記します。 なお、画像認識機能を利用するソースファイルは Objective-C++形式(.mm) にする必要があります。
@interface ViewController ()
@property (nonatomic) GPImageRecognitionEngine* recognitionEngine;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.recognitionEngine = [GPImageRecognitionEngine sharedManager];  //画像認識エンジンを取得
    [self.recognitionEngine setPreviewView:self.view];                  //プレビューを表示するレイヤを指定する
    [self.recognitionEngine setDelegate:self];

    GPFineRecognizer *recognizer = [[GPFineRecognizer alloc] init];
    [recognizer loadFromPath:[[NSBundle mainBundle] resourcePath] fileName:@"サンプル辞書"];//画像辞書を読み込む

    [self.recognitionEngine setRecognizer:recognizer];
}

//検出したらアラートを出す
-(void)didImageRecognition:(NSDictionary*)result{
    @autoreleasepool
    {
        if([[result objectForKey:@(GPRecognizerResultIsDetected)] boolValue]){
            [self.recognitionEngine stop];

            dispatch_async(dispatch_get_main_queue(), ^{
                NSString* message = [[NSString alloc]
                                 initWithFormat:@"%@ : %@\nスコア : %.2f%%\n\nキーポイント検出 : %.3f秒\n特徴量の計算 : %.3f秒\nマッチング : %.3f秒\n"
                                 , [result objectForKey:@(GPRecognizerResultDatasetTag)]
                                 , [result objectForKey:@(GPRecognizerResultVisualWordTag)]
                                 , [[result objectForKey:@(GPRecognizerResultScore)] floatValue] * 100
                                 , [[result objectForKey:@(GPRecognizerResultKeypointElapsedTime)] doubleValue]
                                 , [[result objectForKey:@(GPRecognizerResultDescriptionElapsedTime)] doubleValue]
                                 , [[result objectForKey:@(GPRecognizerResultMatchElapsedTime)] doubleValue]];

                [[[UIAlertView alloc] initWithTitle:@"検出結果" message:message delegate:self cancelButtonTitle:nil otherButtonTitles:@"閉じる", nil] show];
            });
        }
    }
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    [self.recognitionEngine start]; //検出アラート後に再開
}

-(void)viewDidAppear:(BOOL)animated{
    [self.recognitionEngine start];//画像認識を開始する
}

@end
 

インストール手順(Android)

ライブラリの組み込み

本ライブラリをアプリに組み込むには、下記の手順で行います。
  1. 本ライブラリをダウンロードして下さい。
  2. 本ライブラリを解凍し、中に入っている GPImageRecognitionEngineLibrary.jar ファイルと armeabi フォルダを使用するプロジェクトの “libs” 以下に置きます。

マニフェストファイルの変更

本ライブラリではカメラを使用するので、マニフェストファイルにカメラのパーミッションを追加しておきましょう。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
この 3 行を書いておくとよいでしょう。 ちなみに、このままではオートフォーカスが使用できない端末はアプリをインストールすることができません。よってオートフォーカスを必須条件としない場合には、 3 行目 に android:required="false" を追加しておきましょう。

実装例

Activity に 画像認識機能を組み込む例を示します。
//GPImageRecognitionEngineCallback を実装する
public class MainActivity extends Activity implements GPImageRecognitionEngineCallback, OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //フルスクリーン
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        //プレビューを表示するための SurfaceView
        SurfaceView surface = (SurfaceView)findViewById(R.id.surface);

        //ライブラリ使用時に行う設定
        _engine = GPImageRecognitionEngine.getInstance();
        _engine.setPreviewView(surface);
        _engine.setProcessMethod(this);
        _engine.setPreviewOrientation(PreviewOrientation.PORTRAIT);

        // 認識器の設定
        GPFineRecognizer _recognizer = new GPFineRecognizer();
        _engine.setGPImageRecognizer(_recognizer);

        // assets内のファイルのバイナリからデータセットのバイト列を取得
        // 省略

        // バイナリからデータセットを読み込み
        _recognizer.loadDatasetBinary(this, binBuffer, yamlBuffer);
    }

    @Override
    public void onResume(){
        super.onResume();
        if(_engine!=null){
            try {
                //画像認識を開始する
                _engine.Start();
            }
            catch (CameraStartFailedException e) {}
        }
    }

    @Override
    public void onPause(){
        super.onPause();
        if(_engine!=null){
            try {
                //画像認識を停止する
                _engine.Stop();
            } 
            catch (CameraEndFailedException e) {}
        }
    }

    /**
     * 画像認識ライブラリでのマッチングが終わる度に呼び出される
     * GPImageRecognitionEngineCallback
     */
    @Override
    public void ImageRecognitionResult(GPImageRecognitionEngineResult result) {
        if(result.isRecognized){
            try {
                _engine.Stop();
            } catch (CameraEndFailedException e) {
                e.printStackTrace();
            }
            //result に入っているメタデータを使用する
            showDialog(result);
        }
    }

    public void showDialog(GPImageRecognitionEngineResult result) {
        //省略…
    }
}
 

画像辞書作成ツールについて

画像認識に必要な画像辞書は付属するツールで作成することができます。 (本ライブラリを用いてプログラム上で生成することもできます) 本ツールは以下の機能を提供します。
  • 各画像の認識対象としてのクオリティを視覚的に表示する機能。
  • 各画像に、識別用のタグを設定する機能。

画像辞書作成ツール

・動作確認環境

このツールは Mac版ではMac OS X v10.9、Windows版ではWindows7,8.1で動作確認を行っています。またWindows版では.NET Framework 4.0がインストールされている必要があります。 また下記の画像フォーマットについて動作確認を行っています。
  • Windows Bitmap (BMP, DIB)
  • JPEG (JPEG, JPG, JPE)
  • Portable Network Graphics (PNG)
  • TIFF (TIFF, TIF)
  • JPEG 2000 (JP2)
※ 読み込める画像フォーマットは環境に依存します。

・基本的な使い方

このツールを利用して特徴点データを作成する手順は次のとおりです。
  1. メニュー「ファイル」>「新規作成」を選択し、編集ウィンドウを開きます。
  2. 編集ウィンドウ右にある「項目追加」をクリックしてファイルを選択するか、編集ウィンドウのテーブルに直接ファイルをドラッグ&ドロップして、画像を追加します。
  3. 編集ウィンドウのテーブルに追加した画像が表示されます。画像の下には識別用のタグとして、ファイルの名前が設定されています。必要であれば編集します。また認識対象としてのクオリティも同時に表示されるので、画像の採用の参考にしてください。
  4. 画像の追加とタグの編集を終えたらウィンドウ右下の認識器を選択し、「データセット出力」ボタンからデータセットファイルを出力してください。
※画像認識ライブラリv1は FastRecognizer のみ対応しています。

・その他の機能

  • メニュー「ファイル」>「保存」で編集内容をファイル(Mac版は.dc、Windows版は.wdc)に保存でき、次回読み込むことで作業を再開することができます。
  • 「データセット名」にデータセットに対するタグを設定できます。
  • 「最大特徴点数」には画像から抽出する特徴点の上限値を設定します。この数が多いほど認識精度は向上しますが、比例して処理負荷も高くなります。また、大きすぎる値を設定すると認識率がさがるため、適度な値を設定してください。
  • 「メタタグ読み込み」は、カンマで区切られたテキストファイルをメタタグとして読み込む機能です。画像はあらかじめ「項目追加」で追加しておく必要があります。
 

詳しいチュートリアル

インストール方法、実装方法、ツールの使い方についての更に詳しい説明は、下の配布パッケージに同梱されているチュートリアルをご覧下さい。

更新履歴

画像認識ライブラリ

2015.04.24
データセットにタグが設定されていない場合に強制終了してしまう問題を修正しました。(v2.0.2, iOS)
2015.01.14
一部の端末でアプリが強制終了してしまう問題を修正しました。(v2.0.1, Android)
2014.10.15
iOS8及び64bitに対応しました。(v2.0.1, iOS)
2014.07.11
Android版を公開しました。
2014.03.07
iOS版を公開しました。

画像辞書作成ツール

2014.10.14
Windows版を公開しました。
2014.03.07
Mac版を公開しました。

ダウンロード

本ライブラリは MIT ライセンスのもとで公開されています。
詳細はダウンロードパッケージ内にある LICENSE.txt をご確認ください。

サンプルアプリ「スーパーファミキャプ」

アプリ概要

スーパーファミコンのゲームカートリッジのラベルを、カメラで画像認識して情報を表示するアプリです。
従来より高速かつ高精度になった画像認識ライブラリv2の性能を生かし、数多くのタイトルから対象のゲームをすばやく探し出します。

アプリの主な機能
  • カメラ機能:ゲームカートリッジをカメラにかざすと、そのゲーム情報が表示されます。また、カメラで撮影したカセットの画像はコレクションできます。
  • ゲームカートリッジ一覧:過去に国内で発売されたゲームカートリッジが一覧で表示されます。また、一覧から選択したゲーム情報が見れます。
  • コンフィグ:アプリ中の文字表示速度や、ウィンドウの背景色をカスタマイズすることができます。
ご利用の注意点

対応しているゲームカートリッジは日本国内販売品のみです。