camera2人脸检测回调

Posted

技术标签:

【中文标题】camera2人脸检测回调【英文标题】:camera2 face detection call back 【发布时间】:2016-02-18 08:11:24 【问题描述】:

我正在尝试在 camera2 api 中使用人脸检测器。我将预览生成器设置为使用人脸检测器:

                        previewBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
                        CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);
                        CR = previewBuilder.build();
                        CS = session;
                        CS.setRepeatingRequest(CR, CScallback, null);

但我不明白代码在检测到人脸时会命中哪里?它是否在 CameraCaptureSession.CaptureCallback 中返回人脸?它会将检测到的人脸信息发回哪里?

【问题讨论】:

您可能使用了错误的 API。你用的是哪一个?试试下面的链接。它可能对你更有效。 developers.google.com/vision/face-detection-concepts 没有,它内置的camera2有一个可用的API。我做了一些研究,我认为它只有在你拍照后才有效。但是在预览期间我需要一个面部检测器 您正在寻找 OEM 对其相机应用程序所做的事情?在拍摄照片之前,检测到的人脸在哪里? 用于测试的方形边框,这意味着我想看看它与脸部的边框如何。实际上,我不想在最终产品中向用户展示这一点。我在 android camera 2 中看到一个人脸对象,它不仅有边框,还有眼睛位置:developer.android.com/reference/android/hardware/camera2/params/… 唯一的问题是我如何访问这些信息?它是在进行实时预览时还是在拍照后提供此功能? 【参考方案1】:

我刚刚发现使用Camera2 Basic sample 在正确设置捕获会话后,从 Camera2 预览中获取人脸数组相对容易。

在 Camera2 Basic 示例的 setUpCameraOutputs 方法中添加以下检查:

int[] FD =characteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
int maxFD=characteristics.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT);

if (FD.length>0) 
    List<Integer> fdList = new ArrayList<>();
    for (int FaceD : FD
            ) 
        fdList.add(FaceD);
        Log.d(TAG, "setUpCameraOutputs: FD type:" + Integer.toString(FaceD));
    
    Log.d(TAG, "setUpCameraOutputs: FD count" + Integer.toString(maxFD));

    if (maxFD > 0) 
        mFaceDetectSupported = true;
        mFaceDetectMode = Collections.max(fdList);
    

然后在创建捕获会话的 createCameraPreviewSession() 方法中添加以下对人脸检测方法的调用:

@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) 
    // The camera is already closed
    if (null == mCameraDevice) 
        return;
    
    // When the session is ready, we start displaying the preview. ...
    // Flash is automatically enabled when necessary.
    setAutoFlash(mPreviewRequestBuilder);

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>HERE>>>>>>>>>>>>>>>>                                   
    //Face detection setup
    setFaceDetect(mPreviewRequestBuilder,mFaceDetectMode);...

setFaceDetect(mPreviewRequestBuilder,mFaceDetectMode);代码可以是这样的:

private void setFaceDetect(CaptureRequest.Builder requestBuilder , int faceDetectMode)
    if (mFaceDetectSupported)
        requestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,faceDetectMode);
    


只需添加几行代码,即可在 CameraCaptureSession.CaptureCallback 中完成人脸检测:

 private CameraCaptureSession.CaptureCallback mCaptureCallback
        = new CameraCaptureSession.CaptureCallback() 

private void process(CaptureResult result) 
    switch (mState) 
        case STATE_PREVIEW: 
            // We have nothing to do when the camera preview is working normally.
            //But we can for example detect faces 
            Face face[]=result.get(CaptureResult.STATISTICS_FACES);
            if (face.length>0 )
                Log.d(TAG, "face detected " + Integer.toString(face.length));
                takePicture();
            

            break;
        

我测试了代码的这种更改并且它可以工作(一旦检测到我的脸,我就会捕捉自拍......您可以在此处查看 Face 类的更多选项: Face

【讨论】:

谢谢你,效果很好,但我需要为面部添加一个空检查。 if (face != null && face.length>0) 工作得很好【参考方案2】:

http://developer.android.com/reference/android/hardware/camera2/CaptureResult.html

因此,面部数据似乎仅在拍摄照片后可用,换句话说,在预览发生时不可用。当您为预览构建器设置人脸检测模式时,这意味着捕获结果将在拍摄照片时获取元数据。我会尝试在预览中找到一种方法,我想我可以拍摄预览的快照并使用后台线程运行人脸检测。我将针对该场景单独提出一个问题。

【讨论】:

我在人脸检测方面也遇到了同样的问题,你最终解决了吗?我尝试在一周内解决它,现在没有seccess(( 我恢复到camera api(旧的)而不是camera2。抱歉不能说如何解决这个问题 你对使用 OpenCV 有什么看法?图书馆有很多属性。我问是因为我决定使用它,你认为这是一个好主意吗? 我不确定,我并没有真正玩过 OpenCv。我使用了 snapdragon 和相机 api。 developer.qualcomm.com/software/snapdragon-sdk-android

以上是关于camera2人脸检测回调的主要内容,如果未能解决你的问题,请参考以下文章

我无法用 camera2 检测到人脸

使用后置摄像头的人脸检测无法使用 camera2 API 正常工作

需要在使用 MLKit 和 Camera2 进行人脸检测期间捕获静止图像

Android原生人脸识别Camera2示例

Android(玻璃)无法在 onFaceDetection 中检测人脸

转载超简单集成HMS ML Kit 人脸检测实现可爱2D贴纸