[RK3288][Android6.0] 调试笔记 --- 原生人脸检测功能无法使用

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


效果:

验证下来自带检测功能不是很理想,只能检测到正脸,侧脸就无法识别了。


参考:

Google_FaceDetetor CameraHal 实现

猜你喜欢

转载自blog.csdn.net/kris_fei/article/details/81114578