我正在编写一个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();
}
}