プレビューの顔認識「FaceDetecionListener」
プレビューの顔認識はAndroid 4.0の新機能の1つです。「android.hardware.Camera.FaceDetectionListener」クラスを使います。
FaceDetecionListenerの使い方
使い方は以下のような感じになります。
- FaceDetectionListenerを実装する
- Camera#setFaceDetectionListener()にリスナを登録する
- Camera#startFaceDetection()を呼び出す
- 顔認識ができたらFaceDetectionListener#onFaceDetection()が呼び出される
- 受け取った顔情報を基にオーバーレイする
機種によって異なる可能性がありますが、静止画の顔認識と異なりプレビューの顔認識はかなり速く、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の新機能について取り上げる予定です。
- グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方
- 細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめ
- 腕時計から電話をかけるAndroid Wearアプリの作り方
- Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方
- Android 5.0発表&スマホと連動する音声認識Android Wearアプリの作り方
- ウェアラブル端末用Android Wearアプリ開発の基礎知識
- 変わらないと生き残れないAndroid Lの新機能まとめ
- Android WearやIoTで注目のAndroidセンサー機能8選
- ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ
- あなたの知らないAndroid SDKの便利tools、14選まとめ
- Android 4.4のメモリ使用状況を把握する3つのツールの使い方
- Androidでリアルタイムマルチプレーゲームを開発するには
- 低性能端末でも使えるか? Android 4.4 KitKatの新機能39選
- もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能
- アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識
- あなたのアプリはクラウドにデータをバックアップできますか?
- Eclipse ADTに代わるIDEとなるか? Android Studioの基礎知識
- ActionBarで、アプリのUIはこんなにスマートになる
- Android 4.x時代のアプリにないと残念なActionBarとは
- 動的クラスローディングでAndroidアプリ“裏”開発
- Android 4.xのAndroidビームをアプリに組み込むには
- AndroidアプリでNFCタグを読み書きするための基礎知識
- 新タブレット時代を見据えるAndroid 4.2の新機能9選
- Androidからイヤフォンやヘルス機器とBluetooth通信するには
- Bluetoothを使ってAndroidアプリ同士で通信するには
- Androidアプリをアプリ内購読に対応してもうける方法
- 開発者が知らないと残念過ぎるAndroid 4.1の新機能36選
- Androidのプロセス間通信を自由自在にするAIDL
- Android 4.0のサービス/プロセス間通信の基本
- Androidアプリでマルチメディアを扱うための基礎知識
- Androidのウィジェットにノーティフィケーションするには
- Android 4.0で注目の顔認識をアプリに組み込むには
- Android 4.0でアプリ開発を始めるための環境構築
- 開発者が知らないと損するAndroid 4.0の新機能44選
- Android Compatibility packageで2.x系でもマルチサイズ対応
- Androidの画面の大きさの違いを解決するFragments
- Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 開発者が知って得するAndroid 2.3の新機能18選
- アニメーションでAndroidに独創的な画面エフェクトを
- Androidアプリで“アニメーション”するための基礎知識
- XMLレイアウトでAndroidアプリに“設定画面”を追加
- 開発者が知っておきたいAndroid 2.2の新機能12連発
- もはやケータイに必須のカメラをAndroidで制御しよう
- 地図/位置情報/GPSを使うAndroidアプリを作るには
- Android NDKでJNIを使用してアプリを高速化するには
- Android 2.1の新機能「Live Wallpaper」で作る、美しく燃える“待ち受け”
- iPhoneより多彩なAndroidのセンサをアプリで操作
- SurfaceViewならAndroidで高速描画ゲームが作れる
- Android 1.6のジェスチャーとテキスト読み上げを使う
- Androidのホーム画面に常駐するアプリを作るには
- Netbookにも広まるAndroidで、かつてないWeb体験を
- アプリを国際化してAndroid Marketから世界へ発信
- 常駐アプリが作成できるAndroidの“サービス”とは
- AndroidでSQLiteのDB操作をするための基礎知識
- Androidアプリの使いやすさを左右する5つのレイアウト
- 簡単でワクワクするAndroidウィジェット10連発!
- ブラウザや地図、ストリートビューの基、Intentとは?
- Androidアプリ作成の基本“Activity”とは何か?
- Android Market配布を目指しEclipseでHelloWorld!
関連記事
Copyright © ITmedia, Inc. All Rights Reserved.