新的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,
之后会继续调用:
没有创造的生活不能算生活,只能算活着。