Tech Sketch Bucket of Technical Chips by TIS Inc.

OpenCVによる画像認識アプリケーション with Google Glass(1)

Pocket

OpenCV(Open Source Computer Vision Library)は、Intel Russia Research Centerによって開発され、現在はWillow Garageに開発が引き継がれているコンピュータビジョンライブラリです。応用分野は多岐に渡りますが、ここではGoogle Glass上でリアルタイムな画像認識を行うアプリケーション作成のためにOpenCVライブラリを利用しました。本投稿を通じて、Glassでの画像認識アプリケーションの開発とパフォーマンスの検証結果について3回に分けて書いていきたいと思います。第一回はアプリケーションの全体像とOpenCVライブラリを静的ビルドによりGoogle Glassのアプリケーションに組み込み、カメラプレビューを表示するための実装するまでを記します。

opencv_logo
ocv_withglass_link

アプリケーションの概要

処理の全体像は以下の図のようになります。画像処理は計算量を考慮し、JNI(Java Native Interface)を介してネイティブコードで実行します。

gw_ocv_withglass_overview

上の図の①〜②の処理は前処理にあたります。認識対象となる訓練画像をもとに特徴量計算を実施し、計算結果をアプリケーション内に保持します。画像データに関しては、OpenCVから提供されているMat型として処理します。③〜⑦は画像認識処理部分です。カメラから取得した画像の特徴量を計算し、訓練画像と比較して検出対象の画像が含まれるかどうかを判断します。

  • 開発環境を以下に記します。

実行デバイスGoogle Glass(XE21)
開発PCMacBookPro (OSX Yosemite 10.10.1)
統合開発環境Eclipse 4.4.0 + ADT + CDT
Android SDK4.4.2 (API Level 19) ※1
Android NDKr10 (64-bit) ※2
OpenCV version2.4.9

※1: コンパイルにはGDK(Glass Development Kit)を使用
※2: Android NDKのツールndk-buildのパスを.bashrcで設定

OpenCVを使ってGlass上でカメラプレビューを表示する

ここからはOpenCVを利用したカメラプレビューの表示を見ていきます。AndroidアプリケーションでOpenCVを利用する場合、OpenCV ManagerをGoogle Playからインストールして動的リンクする方法と、Android NDKにより静的リンクする方法がありますが、今回作成するアプリケーションは静的リンクする方法を採用しています。OpenCV Managerはデバイスの違いを吸収してくれるという利点はありますが、現時点ではGoogle GlassがGoogle Playに接続できないこと、デバイスの違いを意識する必要がないため静的リンクによる方法を選択しました。

プロジェクトの作成

  • OpenCVライブラリを公式サイトから入手し、"OpenCV Library - 2.4.9"をworkspaceにimport
  • Android Application Projectを作成し、上記のライブラリをリンクの対象として指定
  • プロジェクトのルートディレクトリにjniフォルダを作成し、その下にAndroid.mk、およびApplication.mkを新規作成

OpenCVの静的ライブラリを生成

静的ライブラリを生成するために、AndroidNDKに含まれるndk-buildを使用します。こちらからAndroidNDKのインストーラーを入手してインストール後、.bashrcでndk-buildがある場所を$PATHに設定しておきます。

次にAndroid.mk、およびApplication.mkを実装します。

Android.mk

Android.mkの中ではビルドの対象とするモジュールを指定します。6~7行目でモジュールを設定しています。9行目でOpenCV for Androidに含まれる"sdk/native/jni/OpenCV.mk"をincludeしています。

Application.mk

Application.mkではアプリケーションの実行環境やCPUアーキテクチャなど、ビルドに関する設定情報を記述します。

ndk-buildの実行

ここまで済んだらターミナルでプロジェクトのルートディレクトリに移動し、ndk-buildを実行します。これによりライブラリが静的ビルドされてライブラリファイル(*.so)がプロジェクト内に生成されます。(未検証ですが、Windowsの場合はリンクの手順に従ってプロジェクトの設定を行えばAndroid Application Projectのビルド時に静的ライブラリが生成されると思います)

Androidアプリケーションの実装

ORBDetection.java

ここからはAndroidアプリケーションを実装していきます。OpenCVライブラリをプログラム内で利用するにはロードする必要がありますが、この処理はアプリ実行時に一度だけすればよいのでandroid.app.Applicationを継承したカスタムクラスで実装します。

AndroidManifest.xmlなど

Glass上で動かすために必要なAndroidManifest.xml内の記述やボイスコマンドに必要な記述に関しては過去の記事公式サイトのドキュメントをご参考ください。

activity_camera.xml

次はレイアウトのxmlです。カメラプレビューの表示にはOpenCVのJavaCameraViewクラスを使用します。"@dimen/view_width"と"@dimen/view_height"にはそれぞれ640px, 360pxを設定しています。

CameraActivity.java

OpenCVを利用してGlassの画面にカメラプレビューを表示するための最小実装になります。CvCameraViewListener2インターフェースのメソッドを実装することで、OpenCVの基本クラスMat型としてカメラから入力された画像をプログラムの中で扱うことができるようになります。51〜56行目では入力された画像をRGBA形式に変換して返しているのみですが、ここでOpenCVのライブラリを利用して画像処理を行うことができます。

実行結果

ここまでの実装をビルドして実行するとカメラプレビューが表示されます。次回はORBアルゴリズムによる画像認識の実装に入ります。

ocv_withglass_camerapreview_minimal

エンジニア採用中!私たちと一緒に働いてみませんか?