qq69696698的专栏

新的Camera feature: Face Detection1. camera app, in packages/apps/Camera/src/com/android/camera/camera.javastartFaceDetection()

stopFaceDetection()

在initializeFirstTime()函数中会调用startFaceDetection() ,以开始做人脸识别的准备动作。

在startFaceDetection中会首先判断getMaxNumDetectedFaces是否大于0,若没有大于0,则表示硬件不支持人脸识别,直接退出函数,否则

mCameraDevice.setFaceDetectionListener(this);mCameraDevice.startFaceDetection();

设置人脸识别的监听者为this(注意这边的参数,这意味着在mCameraDevice中的mFaceListener其实为这边的package中的camera类),用于回调函数,并调用mCameraDevice的startFaceDetection。

在这文件中还有一个关键函数:

onFaceDetection()

这在mCameraDevice中会调用到,用作最后的显示动作。

这里的mCameraDevice就是framework层的camera类。

这边还有个Faceview类,,简单做个介绍,位于packages/apps/Camera/src/com/android/camera/ui/FaceView.javapublic class FaceView extends View implements FocusIndicator{ ….} In FaceView:frameworks/base/media/java/android/media/FaceDetector.javaframeworks/base/graphics/java/android/graphics/Matrix.javaframeworks/base/graphics/java/android/graphics/RectF.java

frameworks/base/graphics/java/android/graphics/drawable/Drawable.java

主要是关于人脸识别后的view的一些操作。

2. 接着上面说mCameraDevice

位于frameworks/base/core/java/android/hardware/Camera.java

相关变量的定义: private FaceDetectionListener mFaceListener; private boolean mFaceDetectionRunning = false; private static final int CAMERA_FACE_DETECTION_HW = 0; private static final int CAMERA_FACE_DETECTION_SW = 1; public interface FaceDetectionListener{ void onFaceDetection(Face[] faces, Camera camera);//这里调用的就是package中camera类的函数 } public final void setFaceDetectionListener(FaceDetectionListener listener){ mFaceListener = listener;//设置监听者 } public final void startFaceDetection() { if (mFaceDetectionRunning) { throw new RuntimeException("Face detection is already running"); } _startFaceDetection(CAMERA_FACE_DETECTION_HW);//真正开始FaceDetection的地方 mFaceDetectionRunning = true; } public final void stopFaceDetection() { _stopFaceDetection();//停止FaceDetection mFaceDetectionRunning = false;

}

private native final void _startFaceDetection(int type);

private native final void _stopFaceDetection();

_startFaceDetection()和_stopFaceDetection()都是jni的方法,即用到本地调用,_startFaceDetection()会调用到android_hardware_Camera_startFaceDetection这个函数:

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

这边会调用到Hal层的sendCommand方法,传递CAMERA_CMD_START_FACE_DETECTION消息,在Hal要对这个Message进行处理,以开始处理人脸识别。这边介绍一下ti的做法:

in camera hal:

status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2){

……

switch(cmd) { case CAMERA_CMD_START_SMOOTH_ZOOM: ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1); break; case CAMERA_CMD_STOP_SMOOTH_ZOOM: ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM); case CAMERA_CMD_START_FACE_DETECTION: ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD); break; case CAMERA_CMD_STOP_FACE_DETECTION: ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD); break; default: break; };

}

遇到CAMERA_CMD_START_FACE_DETECTION这个消息后,会继续调用mCameraAdapter->sendCommand,

之后会继续调用:

没有创造的生活不能算生活,只能算活着。

qq69696698的专栏

相关文章:

你感兴趣的文章:

标签云: