Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92
说明:
Google原生自带人脸检测功能,并且分两种。
- 是通过传递Bitmap检测图中人脸,这里不做讨论。
- 实时从Camera获取数据检测。
至于这两种用法,可参考如下文章:
Android 人脸检测 非人脸识别
流程:
第二种方法是在HAL层实现检测,start的流程如下:
startFaceDetection ->
_startFaceDetection ->
android_hardware_Camera_startFaceDetection ->
camera->sendCommand -> //cmd: CAMERA_CMD_START_FACE_DETECTION
CameraHal::sendCommand ->
commandThreadCommandQ.put -> //msg:CMD_START_FACE_DETECTION
CameraHal::commandThread ->
mEventNotifier->startFaceDection ->
AppMsgNotifier::startFaceDection ->
AppMsgNotifier::initializeFaceDetec ->
dlopen -> //打开libFFTEm.so
这里库是存在的,来自external/neven,然后获取库中对应的函数:
mFaceDetectorFun.mFaceDectStartFunc = (FaceDetector_start_func)dlsym(mFaceDetectorFun.mLibFaceDetectLibHandle, "FaceDetector_start");
mFaceDetectorFun.mFaceDectStopFunc = (FaceDetector_stop_func)dlsym(mFaceDetectorFun.mLibFaceDetectLibHandle, "FaceDetector_stop");
mFaceDetectorFun.mFaceDectFindFaceFun = (FaceDetector_findFaces_func)dlsym(mFaceDetectorFun.mLibFaceDetectLibHandle, "FaceDetector_findFaces");
mFaceDetectorFun.mFaceDetector_initizlize_func = (FaceDetector_initizlize_func)dlsym(mFaceDetectorFun.mLibFaceDetectLibHandle, "FaceDetector_initizlize");
mFaceDetectorFun.mFaceDetector_destory_func = (FaceDetector_destory_func)dlsym(mFaceDetectorFun.mLibFaceDetectLibHandle, "FaceDetector_destory");
mFaceContext = (*mFaceDetectorFun.mFaceDetector_initizlize_func)(DETECTOR_OPENCL, 15.0f , 1);
但是对应的函数符号表却没有,比如FaceDetector_start,去external/neven下搜索,并没有实现。 因此人脸检测会失败。
解决方法:
更新libFFTEm.so
rk3399平台上已经解决了此问题,so名字改成了libcam_facedetection.so,放在了目录
vendor/rockchip/common/gpu/gpu_performance/lib/arm
效果:
验证下来自带检测功能不是很理想,只能检测到正脸,侧脸就无法识别了。