X

FaceDetectorを使って顔認識を行う

Androidのフレームワークには標準で顔認識を行ってくれるクラスがあります。

FaceDetectorクラスを使うことによって簡単に、画像の中の顔の数や、その位置を得ることができます。

それでは続きで説明していきます。

認識を行う画像の準備

FaceDetectorクラスで認識を行う画像がBitmapクラスで用意する必要があります。

BitmapFactoryクラスのメソッドを使うなどしてBitmapクラスを事前に準備しておきましょう。サンプルコードではSDカード内のJPEGファイルを読み込んでBitmapクラスを生成しています。

FaceDetectorクラス

コンストラクタで認識を行う画像の横と縦の長さと、認識する顔の最大数を指定します。

public FaceDetector (int width, int height, int maxFaces)

画像のサイズはBitmapクラスのgetWidth()、getHeight()メソッドを使うことになるかと思います。(もちろん直接指定しても問題はありません)
サンプルコードでは下記のようにインスタンスを生成しています。

String filePath = Environment.getExternalStorageDirectory().getPath() + "/sample.jpg";
Bitmap image = BitmapFactory.decodeFile(filePath);
FaceDetector faceDetector = new FaceDetector(image.getWidth(), image.getHeight(), MAX_FACES);

顔認識の実行

FaceDetectorクラスのインスタンスを生成したら、findFaces()メソッドで認識を行います。

public int findFaces (Bitmap bitmap, Face[] faces)

引数には認識を行わせたい画像のBitmapクラスと、認識結果として受け取るFaceクラスの配列を指定します。

このFaceクラスの配列の要素数はFaceDetectorクラスのコンストラクタで第3引数に指定した認識する顔の数の最大数と同じにする必要があります
戻り値は認識された顔の数が返ってきます。

Faceクラス

FaceDetectorクラスのfindFacesメソッドを呼んで、戻り値に1以上が返ってきた場合は認識された顔があるということですので、その数だけFaceクラスの配列に認識された情報が入っています。

Faceクラスのメソッド

メソッド名 取得できる情報
confidence() 認識された顔の信頼度
eyesDistance() 両目の中心座標
getMidPoint(point) 両目の間隔


認識された顔の情報はこれらのメソッドを使って取得することができます。
ドキュメントにはposeメソッドを使って顔の傾きも取れるとなっていますが当方の環境では正しく値が取得できませんでした(x,y,z軸すべてが0と返ってくる)
サンプルコードでは下記のようにログに取得した情報を出力しています。

Face[] faces = new Face[MAX_FACES];
int num = faceDetector.findFaces(image, faces);
Log.d(TAG, "the number of faces found:" + String.valueOf(num));
for (int i = 0; i < num; i++) {
	PointF point = new PointF();
	faces[i].getMidPoint(point);
    Log.d(TAG, "Number" + i + " confidence:" + faces[i].confidence());
    Log.d(TAG, "Number" + i + " eyesDistance:" + faces[i].eyesDistance());
    Log.d(TAG, "Number" + i + " the position of the mid-point between the eyes:" + point.x + "," + point.y);
}

サンプルコードについて

サンプルコードではSDカードのルートに置かれたsample.jpgを認識の対象としています。必要に応じて変更してください。

String filePath = Environment.getExternalStorageDirectory().getPath() + "/sample.jpg";
kkato: