連載
» 2012年01月18日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(28):Android 4.0で注目の顔認識をアプリに組み込むには (2/2)

[緒方聡,株式会社イーフロー]
前のページへ 1|2       

プレビューの顔認識「FaceDetecionListener」

 プレビューの顔認識はAndroid 4.0の新機能の1つです。「android.hardware.Camera.FaceDetectionListener」クラスを使います。

図4 プレビューの顔認識 図4 プレビューの顔認識

FaceDetecionListenerの使い方

 使い方は以下のような感じになります。

  1. FaceDetectionListenerを実装する
  2. Camera#setFaceDetectionListener()にリスナを登録する
  3. Camera#startFaceDetection()を呼び出す
  4. 顔認識ができたらFaceDetectionListener#onFaceDetection()が呼び出される
  5. 受け取った顔情報を基にオーバーレイする

 機種によって異なる可能性がありますが、静止画の顔認識と異なりプレビューの顔認識はかなり速く、Galaxy Nexusではほぼリアルタイムです。ただし、精度と認識率は静止画の顔認識に少し後れを取るといった印象です(図4の花嫁と女の子は認識されていません)。

FaceDetecionListenerを使う際のポイント

 以下に使い方のポイントを説明します。

 機種ごとのカメラの性能や実装の有無により、プレビューの顔認識ができない可能性があるので、以下のように対応しているかどうかを事前に取得します。

// カメラが顔認識可能な数を取得
int max = camera.getParameters().getMaxNumDetectedFaces();
if (max > 0) {
    // 顔認識可能
}

 これを事前に行わない場合、顔認識を行うためにCamra#startFaceDetection()を呼び出すと、IllegalArgumentExceptionが発生します。

 顔認識の開始と終了は以下のように行います。

// 顔認識開始
camera.startFaceDetection();
// 顔認識終了
camera.stopFaceDetection();

 顔認識はプレビュー表示中でなければ開始できません。顔認識中に再びCamra#startFaceDetection()を呼び出すと、RuntimeExceptionが発生します。Cameraクラスからは顔認識中であるかどうかの状態は取得できないので、アプリ自身で管理しなければなりません。

 また、顔認識中にはCamera#setWhiteBalance(String)、Camera#setFocusAreas(List)、Camera#setMeteringAreas(List)が機能しません。

FaceDetecionListenerで得られる情報

 顔認識のコールバックには顔情報が配列で渡されますが、この顔情報はFaceDetectorの顔情報とは異なる「Camera.Face」クラスを使用します。

情報取得メソッド 説明
Face#id 顔を特定するID。サポートされない場合は「-1」
Face#leftEye 左目の位置。サポートされない場合はnull
Face#rightEye 右目の位置。サポートされない場合はnull
Face#mouth 口の位置。サポートされない場合はnull
Face#rect 顔の矩形
Face#score 信頼度。1〜100で「100」が最も信頼できる

座標はMatrixクラスで変換しよう

 Face#rectは、そのまま画面上の座標として使用できず、「Matrix」クラスを使用して以下のように座標変換をしなければなりません。

for (Face face : faces) {
    Matrix matrix = new Matrix();
    // フロントカメラかどうか
    boolean mirror = (info.facing == CameraInfo.CAMERA_FACING_FRONT);
    matrix.setScale(mirror ? -1 : 1, 1);
    matrix.postScale(getWidth() / 2000f, getHeight() / 2000f);
    matrix.postTranslate(getWidth() / 2f, getHeight() / 2f);
    // 現在のマトリックスを保存
    int saveCount = canvas.save();
    // 顔認識のマトリックスをキャンバスに反映
    canvas.concat(matrix);
    // 矩形を描画
    canvas.drawRect(face.rect, paint);
    // 保存したマトリックスを戻す
    canvas.restoreToCount(saveCount);
}

カメラの使い方も一緒に覚えよう

 今回は顔認識の使い方に関して解説しました。いかがだったでしょうか。意外と簡単に使えるということが理解いただけたのではないかと思います。

 顔認識は主にカメラ系のアプリで使われる機能になるかと思います。カメラの使い方に関する記事は連載第17回の「もはやケータイに必須のカメラをAndroidで制御しよう」に解説があるので、そちらも参照してください。

 次回もAndroid 4.0の新機能について取り上げる予定です。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。