getMaxNumberDetectedFaces()> 0但onFaceDetection从未触发

时间:2018-02-13 17:26:03

标签: android bitmap camera hardware face-detection

我正在编写一个Android应用程序,它使用Camera.FaceDetection作为触发器来处理图像。它不是必需的,而是“很高兴”,这确实提高了可用性。默认情况下,getMaxNumberDetectedFaces返回< = 0时会被禁用。

我遇到的问题是,有许多设备会为getMaxNumberDetectedFaces返回一个正整数,但从来没有打扰到实际触发onFaceDetection回调。这会导致我的应用程序在检测到的Face上永远等待。

如果硬件真的支持它,我需要一个明确的方法来找出它。

我想出的唯一一件事是等待一段时间(比方说10秒),确定相机在开始预览后没有看到任何脸,只是为了尝试使用FaceDetection软件。如果我在那里检测到一个Face,我知道相机硬件功能会以某种方式被破坏。

但这不是我想去的路线:我需要将NV21图片转换为位图,旋转它,将其放入FaceDetection并查看是否有脸。

如果“真的”没有看到Face(即用户指向别的东西),我必须重复,如果硬件面部检测工作仍然无能为力。

更糟糕的是,转换为Bitmap,旋转和检测面部的过程在旧设备上可能需要4秒,而硬件检测器在Pixel2上每30ms触发一次。

为了测试我身边的实施错误,我安装了OpenCamera并观察了带有矩形的Faces ......但没有成功。这个应用似乎有同样的问题。

所以我想知道是否有快速可靠的方法来确定FaceDetection是否有硬件支持? 具有已知在该特征上被破坏的设备的计算列表也将有帮助

编辑:由于请求,我添加了一些代码

private static final int FACE_SEEN_THRESHOLD = 200;

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    Log.d(TAG, "onPreviewFrame has " + data.length + " bytes");
    if (null == mCamera) return; //prevent race conditions
    boolean hasFaceDetection = camera.getParameters().getMaxNumDetectedFaces() > 0;
    if (!mFaceDetectionEnabled && hasFaceDetection){
        camera.startFaceDetection(this);
        mFaceDetectionEnabled = true; //prevent call startFaceDetection twice
    }
    if ((System.currentTimeMillis() - mLastFaceSeen) < FACE_SEEN_THRESHOLD || !hasFaceDetection){
         new PreviewTask().execute(data);
    }
}

@Override
public void onFaceDetection(Camera.Face[] faces, Camera camera) {
    Log.d(TAG, "onFaceDetection: faces=" + (faces == null ? "null" : faces.length));
    if (null != faces && faces.length > 0){
        mLastFaceSeen = System.currentTimeMillis();
    }
}

0 个答案:

没有答案