【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 顔検出

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はCamera.Parametersの顔検出に関連する設定値を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。

顔検出

カメラデバイスには顔検出が実装されているものがあります。
Camera.Parameters内にある顔検出に関連するデータのキーは下記のとおりです。
max-num-detected-faces-hwカメラデバイスがサポートしているハードウェア顔検出の最大同時検出数のキーです。
max-num-detected-faces-swカメラデバイスがサポートしているソフトウェア顔検出の最大同時検出数のキーです。

カメラデバイスがサポートしている顔検出数

int getMaxNumDetectedFaces()は同時に顔検出できる最大数を返します。
Camera.Parameters#getMaxNumDetectedFacesの戻り値はCamera.FaceDetectionListener#onFaceDetectionの顔リストの最大長です。戻り値が0の場合、指定された型の顔検出はサポートされていません。

    public void startFaceDetection() {
        stopFaceDetection();
        Camera.Parameters parameters = mCamera.getParameters();
        int maxNumDetectedFaces = parameters.getMaxNumDetectedFaces();
        Log.d(TAG, "maxNumDetectedFaces:" + maxNumDetectedFaces);
        if(maxNumDetectedFaces > 0) {
            mCamera.setFaceDetectionListener(new Camera.FaceDetectionListener() {
                @Override
                public void onFaceDetection(Camera.Face[] faces, Camera camera) {
                    for (int i = 0; i < faces.length; i++) {
                        Camera.Face face = faces[i];
                        Log.d(TAG, "onFaceDetection:" + i);
                        Log.d(TAG, "id: " + face.id);
                        Log.d(TAG, "score: " + face.score);
                        Log.d(TAG, "leftEye: " + face.leftEye);
                        Log.d(TAG, "rightEye: " + face.rightEye);
                        Log.d(TAG, "mouth: " + face.mouth);
                        Log.d(TAG, "rect: " + face.rect);
                        Log.d(TAG, "PixelRect: " + faceRectToPixelRect(face.rect));
                    }
                }
            });
            mCamera.startFaceDetection();
        }
    }