Androidカメラの顔検出機能
顔検出機能を使うには、Cameraへ
setFaceDetectionListener
をセットして
startFaceDetection()
を使う
カメラが顔認識できる数は、
デバイスにより異なるため
まずは、何人まで認識可能か調べる
1 | int maxFaces = param.getMaxNumDetectedFaces(); |
これで、可能な数を変数へ格納
次に、顔認識を検出するリスナーをセット
setFaceDetectionListenerをセットすることで
顔認識が検出できるようになる
1 2 3 4 5 6 7 8 9 10 11 12 | mCamera.setFaceDetectionListener( new FaceDetectionListener(){ @Override public void onFaceDetection(Face[] faces, Camera camera){ //顔を検出したら顔認識マーカー表示ビューへ値を渡す mFaceMarkerView.faces = faces; mFaceMarkerView.invalidate(); } }); |
顔認識がセットできたら、顔認識の開始
顔認識の開始には
startFaceDetection()を呼び出す
1 | mCamera.startFaceDetection(); |
次に、顔認識座標を画面へ反映する
今回は、カスタマイズビューを作成し
顔認識座標を描画する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | if (faces != null ){ for ( int i= 0 ; i<faces.length; i++){ //変更したいのなら前のカメラの状態を保存 int saveState = canvas.save(); //カメラデバイスから取得される値は 1000 ~- 1000 のため Matrixを使い座標を変換できるようにする Matrix matrix = new Matrix(); matrix.postScale(getWidth() / 2000f, getHeight() / 2000f); matrix.postTranslate(getWidth() / 2f, getHeight() / 2f); canvas.concat(matrix); //検出した顔を中心に短形と認識精度を表示 float x= (faces[i]rect.right + faces[i].rect.left)/ 2 ; float y =(faces[i].rect.top + faces[i].rect.bottom)/ 2 ; String score = String.valueOf(faces[i], score); //精度描画 canvas.drawText(score, x, y, point); //顔認識座標を四角で描画 canvas.drawRect(faces[i].rect, point); //Canvasを元の状態へ戻す canvas.restoreToCount(saveState); } } |
なお、顔認識情報は
顔認識した人数分だけ
faces配列へ格納される
Facesクラスへ格納される情報は、以下のように区分される
int id
顔認識ID
Rect rect
顔と認識した範囲
int score
顔の認識率
Point leftEye
左目の中心座標
Point rightEye
右目の中心座標
Point mouth
口の中心座標