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. 無断での引用、転載を禁じます。* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。