はじめに
昨今、Google Glassのようなヘッドマウントディスプレイ型のデバイスを活用してハンズフリーに作業をすることやエンターテイメントの目的で、キーボードや音声による入力ではなくカメラで見たものの情報を入力として画面上に有益な情報を表示するといったソフトウェアに対するニーズが高まっています。Google Glassを始めとする多くのウェアラブル端末はAndroid OS搭載でSDKも提供されているためAndroidアプリ開発者であればウェアラブルデバイス向けのアプリも比較的簡単に開発ができます。
残念なことに、今回使用した端末のモデルは2015年1月19日(米国時間)で販売が終了してしまいましたが、これから紹介する方法はAndroid全般に有効なものなのでGoogle Glassが手元にないからといって、ここまで読んでブラウザの戻るボタンを押さないでいただけると幸いです(また、Googleで開発を続けているという次のモデルでも使えるかもしれません)。
さて、本記事のもう一つのテーマである画像認識機能の実装ですが、OpenCV(Open Source Computer Vision Library)を利用しています。OpenCVは、Intelのロシアの研究チームによって開発されたオープンソースのコンピュータビジョンライブラリです。現在でも精力的に開発が進められているのはもちろんのこと、ライブラリの拡張を目的としたOpenCV Vision Challengeという開発コンテストが開催されるなど、コミュニティ活動も活発です。
アプリケーションの処理概要
Androidアプリケーション内でOpenCVを利用しようとする場合、簡単な処理であれば、Java APIのみで実装することができるのですが、複雑な処理をする場合はAndroid NDKを使って実装を行います。手の込んだ処理はC/C++のコード内でするというわけです。
下図を用いてアプリケーションの全体像を説明したいと思います。図の①~②の処理は前処理にあたります。認識対象となる訓練画像をもとに特徴量計算を実施し、計算結果をアプリケーション内に保持します。画像データに関しては、OpenCVから提供されているMat型として処理します。③~⑦は画像認識処理部分です。カメラから取得した画像の特徴量を計算し、訓練画像と比較して検出対象の画像が含まれるかどうかを判断します。ここで特徴量という聞きなれない言葉がありますが、これについては後ほど説明したいと思います。ちなみに、下の画像の黄色の背景のドクロマークが認識対象となる画像です。
開発環境の構築
以下の環境で実装を行いました。
- 実行デバイス:Google Glass(XE21)
- 開発PC:MacBook Pro(OSX Yosemite 10.10.1)
- 開発ツール:Eclipse 4.4.0
- Android SDK:4.4.2(API Level 19)
- Android NDK:r10(64-bit)
- OpenCV version:2.4.9
Android SDK、Eclipseの環境は通常のAndroidアプリの開発と同様なので省略してAndroid NDKとOpenCVの環境構築の部分のみ説明します。
Android NDKのインストール
以下のサイトからパッケージをダウンロードします。
ターミナル.appを開き、ダウンロードしたディレクトリで以下のコマンドを実行すると必要なファイルが抽出されて、android-ndk-<バージョン名>というフォルダができるかと思います。そのフォルダを任意のディレクトリに置き、.bashrc内でパスを通すことでAndroid NDKのインストールは完了です。
downloads$ chmod a+x <package名> downloads$ ./<package名>
OpenCVのインストール
以下のサイトからAndroid向けのOpenCVライブラリを入手します。
ダウンロードしたファイルを解凍後、任意のディレクトリに保存します。OpenCVは特にインストールの必要はなく、EclipseのWorkspaceにsdkのフォルダをインポートすればOKです。