プレビューの顔認識はAndroid 4.0の新機能の1つです。「android.hardware.Camera.FaceDetectionListener」クラスを使います。
使い方は以下のような感じになります。
機種によって異なる可能性がありますが、静止画の顔認識と異なりプレビューの顔認識はかなり速く、Galaxy Nexusではほぼリアルタイムです。ただし、精度と認識率は静止画の顔認識に少し後れを取るといった印象です(図4の花嫁と女の子は認識されていません)。
以下に使い方のポイントを説明します。
機種ごとのカメラの性能や実装の有無により、プレビューの顔認識ができない可能性があるので、以下のように対応しているかどうかを事前に取得します。
// カメラが顔認識可能な数を取得 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)が機能しません。
顔認識のコールバックには顔情報が配列で渡されますが、この顔情報はFaceDetectorの顔情報とは異なる「Camera.Face」クラスを使用します。
情報取得メソッド | 説明 |
---|---|
Face#id | 顔を特定するID。サポートされない場合は「-1」 |
Face#leftEye | 左目の位置。サポートされない場合はnull |
Face#rightEye | 右目の位置。サポートされない場合はnull |
Face#mouth | 口の位置。サポートされない場合はnull |
Face#rect | 顔の矩形 |
Face#score | 信頼度。1〜100で「100」が最も信頼できる |
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の新機能について取り上げる予定です。
Copyright © ITmedia, Inc. All Rights Reserved.