android4.0 FaceDetection 노트

5930 단어 Android4.0
요 며칠 동안 andoid 4.0.3 FaceDetection은 나중에 쉽게 찾아볼 수 있도록 대략적인 절차를 적습니다.
관련 설명은 다음과 같습니다.
frameworks/base/docs/html/guide/topics/media/camera.jd
시작 코드는camera에 있습니다.jd에서 찾으셔도 돼요.
packages/apps/Camera/src/com/android/camera/Camera.java에서 찾으면 구체적인 코드는 말하지 않겠습니다.
일반 시작점은 startFaceDetection 함수
startFaceDetection 함수의 대략적인 내용은 다음과 같습니다.
 
/*Your application must start the face detection function each time you start (or restart) the

camera preview. Create a method for starting face detection so you can call it as needed, as shown

in the example code below.*/



public void startFaceDetection(){

    // Try starting Face Detection

    ....

    // start face detection only *after* preview has started

    if (params.getMaxNumDetectedFaces() > 0){

        // camera supports face detection, so can start it:

        mCamera.startFaceDetection();

    }

}


우선 하드웨어가 이 기능을 지원하는지 판단한다
 
getMaxNumDetectedFaces 함수
frameworks/base/core/java/android/hardware/Camera.java
내용은 다음과 같습니다.
 
        /**

         * Gets the maximum number of detected faces supported. This is the

         * maximum length of the list returned from {@link FaceDetectionListener}.

         * If the return value is 0, face detection of the specified type is not

         * supported.

         *

         * @return the maximum number of detected face supported by the camera.

         * @see #startFaceDetection()

         */

        public int getMaxNumDetectedFaces() {

            return getInt(KEY_MAX_NUM_DETECTED_FACES_HW, 0);

        }

KEYMAX_NUM_DETECTED_FACES_HW는 일반적으로HAL층 initDefaultParameters 함수에 설정되어 있으며, 설정은 다음과 같다.
p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, "1"); //add by dao set the max face detectctor number 

init Default Parameters에서 이와 같은 코드는 다른 것은 붙이지 않겠습니다.
 
mCamera.startFaceDetection();이거 집행하는 거예요.
frameworks/base/core/java/android/hardware/Camera.java의 startFaceDetection 함수는 다음과 같습니다.
 
    /**

     * Starts the face detection. This should be called after preview is started.

     * The camera will notify {@link FaceDetectionListener} of the detected

     * faces in the preview frame. The detected faces may be the same as the

     * previous ones. Applications should call {@link #stopFaceDetection} to

     * stop the face detection. This method is supported if {@link

     * Parameters#getMaxNumDetectedFaces()} returns a number larger than 0.

     * If the face detection has started, apps should not call this again.

     *

     * <p>When the face detection is running, {@link Parameters#setWhiteBalance(String)},

     * {@link Parameters#setFocusAreas(List)}, and {@link Parameters#setMeteringAreas(List)}

     * have no effect. The camera uses the detected faces to do auto-white balance,

     * auto exposure, and autofocus.

     *

     * <p>If the apps call {@link #autoFocus(AutoFocusCallback)}, the camera

     * will stop sending face callbacks. The last face callback indicates the

     * areas used to do autofocus. After focus completes, face detection will

     * resume sending face callbacks. If the apps call {@link

     * #cancelAutoFocus()}, the face callbacks will also resume.</p>

     *

     * <p>After calling {@link #takePicture(Camera.ShutterCallback, Camera.PictureCallback,

     * Camera.PictureCallback)} or {@link #stopPreview()}, and then resuming

     * preview with {@link #startPreview()}, the apps should call this method

     * again to resume face detection.</p>

     *

     * @throws IllegalArgumentException if the face detection is unsupported.

     * @throws RuntimeException if the method fails or the face detection is

     *         already running.

     * @see FaceDetectionListener

     * @see #stopFaceDetection()

     * @see Parameters#getMaxNumDetectedFaces()

     */

    public final void startFaceDetection() {

        if (mFaceDetectionRunning) {

            throw new RuntimeException("Face detection is already running");

        }

        _startFaceDetection(CAMERA_FACE_DETECTION_HW);

        mFaceDetectionRunning = true;

    }

_startFaceDetection은 JNI에서, CAMERAFACE_DETECTION_HW에서 초기화 값은 0입니다. 이 파일의 시작에 정의가 있습니다.
 
frameworks/base/core/jni/androidhardware_Camera.cpp를 찾을 수 있습니다startFaceDetection에 해당하는 함수:
 
  { "_startFaceDetection",

    "(I)V",

    (void *)android_hardware_Camera_startFaceDetection },

대응:androidhardware_Camera_startFaceDetection:
 
 
static void android_hardware_Camera_startFaceDetection(JNIEnv *env, jobject thiz,

        jint type)

{

    LOGV("startFaceDetection");

    JNICameraContext* context;

    sp<Camera> camera = get_native_camera(env, thiz, &context);

    if (camera == 0) return;



    status_t rc = camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, type, 0);

    if (rc == BAD_VALUE) {

        char msg[64];

        snprintf(msg, sizeof(msg), "invalid face detection type=%d", type);

        jniThrowException(env, "java/lang/IllegalArgumentException", msg);

    } else if (rc != NO_ERROR) {

        jniThrowRuntimeException(env, "start face detection failed");

    }

}

여기camera->sendCommand 대응
 
device/samsung/common/s5p/libcamera/SecCameraHWInterface.cpp 파일의 sendCommand 함수는 다음과 같습니다
 
status_t CameraHardwareSec::sendCommand(int32_t command, int32_t arg1, int32_t arg2)

{

    return BAD_VALUE;

}

여기까지 호출하면 끝이야.
 
서로 다른 산가camera의 라이브러리에 저장된 디렉터리가 다를 수 있으며 이 함수는 구체적인 요구에 따라 수정해야 한다.

좋은 웹페이지 즐겨찾기