Android* で顔検出を実装する

同カテゴリーの次の記事

サンプルコード: 乱数アプリケーション

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Implementing Face Detection in Android」の日本語参考訳です。


サンプルコードのダウンロード

顔検出サンプル [PDF 206KB]

はじめに

顔検出は、多くのカテゴリーのモバイル・アプリケーションにおいて重要な機能と言えます。フォトカタログやソーシャル・アプリケーションなどでは、追加の検索機能を提供することができます。

顔検出は、顔認証機能を実装する最初のステップでもあります。

この記事では、標準の Android* API を利用して、保存されたイメージから顔検出を行う方法を紹介します。

実装

Android* SDK には、顔検出用 API として、イメージから顔検出を行う android.media.FaceDetector クラスが含まれています。顔検出を行うには、FaceDetector クラスの findFaces メソッドを呼び出します。findFaces メソッドは、検出された顔を FaceDetector.Faces[] 配列に格納し、その数を返します。現時点で、findFaces メソッドは RGB_565 形式のビットマップのみサポートしています。

FaceDetector.Face クラスの各インスタンスには、次の情報が含まれています。

  • 顔検出の信頼度 – 0 から 1 の範囲の float 値
  • 両目の距離 (ピクセル単位)
  • 両目の間の中心の座標 (x, y)
  • 顔の傾き (X, Y, Z)

検出された顔を含む矩形領域は含まれません。

サンプルコード

以下に、顔検出のサンプル・ソースコードを示します。このサンプルコードは、SD カードに保存されたイメージを表示し、検出した顔の上に半透明の赤い丸を描画する、カスタム View を有効にします。

ソースコード:

class Face_Detection_View extends View {
    private static final int MAX_FACES = 10;
    private static final String IMAGE_FN = "face.jpg";
    private Bitmap background_image;
    private FaceDetector.Face[] faces;
    private int face_count;

    // onDraw(...) 用に事前に割り当てる
    private PointF tmp_point = new PointF();
    private Paint tmp_paint = new Paint();

    public Face_Detection_View(Context context) {
        super(context);
        // SD カードからイメージをロードする
        updateImage(Environment.getExternalStorageDirectory() + "/" +
            IMAGE_FN);
    }

    public void updateImage(String image_fn) {
        // 内部設定を RGB_565 にする
        BitmapFactory.Options bitmap_options = new BitmapFactory.Options();
        bitmap_options.inPreferredConfig = Bitmap.Config.RGB_565;

        background_image = BitmapFactory.decodeFile(image_fn,
            bitmap_options);
        FaceDetector face_detector = new FaceDetector(
            background_image.getWidth(), background_image.getHeight(),
            MAX_FACES);

        faces = new FaceDetector.Face[MAX_FACES];
        // (現時点では) ビットマップは RGB_565 でなければいけない
        face_count = face_detector.findFaces(background_image, faces);
        Log.d("Face_Detection", "Face Count: " + String.valueOf(face_count));
    }

    public void onDraw(Canvas canvas) {
        canvas.drawBitmap(background_image, 0, 0, null);
        for (int i = 0; i < face_count; i++) {
            FaceDetector.Face face = faces[i];
            tmp_paint.setColor(Color.RED);
            tmp_paint.setAlpha(100);
            face.getMidPoint(tmp_point);
            canvas.drawCircle(tmp_point.x, tmp_point.y, face.eyesDistance(),
                tmp_paint);
        }
    }
}

動作を単純にするため、このサンプルコードでは、画面のサイズに合わせてイメージの拡大/縮小を行っていません。実際のアプリケーションでは、画面のサイズに合わせてイメージを拡大/縮小したり、FaceDetector.Face 属性を拡大/縮小する必要があります。

まとめ

Android* SDK は、保存されたイメージから顔検出を行う標準 API を提供しています。カメラプレビューで顔検出を行う場合は、Camera.FaceDetectionListener クラスを検討してください。

Android* SDK は、顔認識機能を実装する API はサポートしていません。

参考文献 (英語)

FaceDetector クラス:
http://developer.android.com/reference/android/media/FaceDetector.html

FaceDetector.Face クラス:
http://developer.android.com/reference/android/media/FaceDetector.Face.html

Camera.FaceDetectionListener クラス:
http://developer.android.com/reference/android/hardware/Camera.FaceDetectionListener.html

Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。© 2013 Intel Corporation. 無断での引用、転載を禁じます。* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事