zoukankan      html  css  js  c++  java
  • android4.0 FaceDetection笔记

    这几天研究了下andoid4.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);
            }

    而KEY_MAX_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 

    initDefaultParameters里类似这样的代码,其它的我就不贴出来了.

    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里,CAMERA_FACE_DETECTION_HW这里初始化值是0在这个文件的开始有定义

    在frameworks/base/core/jni/android_hardware_Camera.cpp我们可以找到_startFaceDetection对应的函数:

      { "_startFaceDetection",
        "(I)V",
        (void *)android_hardware_Camera_startFaceDetection },

    对应:android_hardware_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的库所存放的目录可能不一样,同时这个函数需要根据具体的要求,进行修改.








  • 相关阅读:
    《那些年啊,那些事——一个程序员的奋斗史》——106
    《那些年啊,那些事——一个程序员的奋斗史》——100
    《那些年啊,那些事——一个程序员的奋斗史》——98
    《那些年啊,那些事——一个程序员的奋斗史》——103
    csla.net 框架的实例应用一(单条记录的演示)
    根据转入的条件拼凑SQL条件语句
    原来我错了(对三层结构的理解)
    在C#和SQL Server数据库中怎么给DateTime类型赋null值、null和
    ajax返回Dataset 绑定html 下拉列表控件
    csla.net 框架的实例应用三(集合多条记录的演示)续
  • 原文地址:https://www.cnblogs.com/riskyer/p/3358182.html
Copyright © 2011-2022 走看看