谁有关于如何使用 Face Detection Camera 2 API 的资料?

Posted

技术标签:

【中文标题】谁有关于如何使用 Face Detection Camera 2 API 的资料?【英文标题】:Who has a material how to work with the Face Detection Camera 2 API? 【发布时间】:2016-06-23 00:31:21 【问题描述】:

在官方来源上没有找到信息...有很多关于如何使用 Camera API 的示例,但是如何使用 Camera2API 任何东西...在 Stake 上进行了一些讨论等等...是一个与我类似的问题,但我有一个问题没有解决。 ..

链接到同一个问题: android camera2 face recognition

我以Google's API for Camera 2为例。

这就是我所做的,但我没有检测到人脸:

我添加了事件

    private void createCameraPreviewSession() 
    try 
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;

        // We configure the size of default buffer to be the size of camera preview we want.
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

        // This is the output Surface we need to start preview.
        Surface surface = new Surface(texture);

        // We set up a CaptureRequest.Builder with the output Surface.
        mPreviewRequestBuilder
                = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewRequestBuilder.addTarget(surface);

        // Here, we create a CameraCaptureSession for camera preview.
        mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
                new CameraCaptureSession.StateCallback() 

                    @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.
                        mCaptureSession = cameraCaptureSession;
                        try 



//           ---->>         Установка модуля распознания лица
                            mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
                                    CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);



                            // Auto focus should be continuous for camera preview.
                            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

                            // Flash is automatically enabled when necessary.
                            setAutoFlash(mPreviewRequestBuilder);

                            // Finally, we start displaying the camera preview.
                            mPreviewRequest = mPreviewRequestBuilder.build();

                            mCaptureSession.setRepeatingRequest(mPreviewRequest,
                                    mCaptureCallback, mBackgroundHandler);
                         catch (CameraAccessException e) 
                            e.printStackTrace();
                        
                    

                    @Override
                    public void onConfigureFailed(
                            @NonNull CameraCaptureSession cameraCaptureSession) 
                        System.out.println("Failed строка 757");
                    
                , null
        );
     catch (CameraAccessException e) 
        e.printStackTrace();
    


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

    @Override
    public void onCaptureProgressed(@NonNull CameraCaptureSession session,
                                    @NonNull CaptureRequest request,
                                    @NonNull CaptureResult partialResult) 
        process(partialResult);
    

    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                   @NonNull CaptureRequest request,
                                   @NonNull TotalCaptureResult result) 
        process(result);
    

    private void process(CaptureResult result) 


--->   //здесь проверяю получает ли он массив лиц или нет + непонятный мод
        Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
        Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
        if(faces != null && mode != null)
            System.out.println("tagDDDDDDDDDDDDDDDDDDDDDDDD" + "faces : " +
                    faces.length + " , mode : " + mode);

        switch (mState) 
            case STATE_PREVIEW: 
                // We have nothing to do when the camera preview is working normally.

//                  Here i set Face Detection
                mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
                        CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);
                break;
            

我在这里检查相机可以获取的最大面孔数

    private void setUpCameraOutputs(int width, int height) 

    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try 
        for (String cameraId : manager.getCameraIdList()) 
            CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);

            // We don't use a front facing camera in this sample.
            Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
            if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) 
                continue;
            

            max_count = characteristics.get(
                    CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT);
            modes = characteristics.get(
                    CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);

            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! max_count " + max_count + " modes " + modes);

** 输出为:**

I/System.out: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! max_count 16 modes [I@3e2907e8

** 这就是日志打印的内容 **

    03-08 18:34:07.018 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.048 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.078 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.118 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.148 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.178 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.218 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.258 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.288 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.308 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1
03-08 18:34:07.348 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1

为什么它不是reterning face?如果有人有正确的工作示例,请提供链接。我如何使用 camera2API 进行人脸检测。整个星期,我都无法理解((

【问题讨论】:

你读过这里的android开发者信息吗:developer.android.com/reference/android/hardware/camera2/…? 是的,但这只是一般性的描述......它如何在人脸检测相机 2 API 中阻止我? 这些有用吗? 1)developer.qualcomm.com/software/snapdragon-sdk-android/…(2)code.tutsplus.com/tutorials/…(3)androidbite.blogspot.in/2012/11/… Stack Overflow 仅提供英文版本。我不知道你问题中的俄文是什么意思,你能用英文吗?如果你使用英语,你也更有可能得到一个好的答案。 您好 Aleksey Timoshchenko,我也遇到了同样的问题。您找到解决方案了吗? 【参考方案1】:

阿列克谢,

您的 RequestBuilder 看起来是正确的,但我认为问题在于您如何选择要使用的相机设备。我有和你一样的设置,它正在工作。

private boolean setUpCameraOutputs() 
    Activity activity = getActivity();
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
    if (manager == null) 
        ErrorDialog.buildErrorDialog("This device doesn't support the Camera2 API.").
            show(getFragmentManager(), "dialog");
        return false;
    
    try 
        // Find a CameraDevice that supports Face recognition, and configure state.
        for (String cameraId : manager.getCameraIdList()) 
            CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);

            // We only use a camera that supports Faces.
            if (!contains(characteristics.get(
                            CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES),
                    CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_SIMPLE)) 
                continue;
            

            StreamConfigurationMap map = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            synchronized (mCameraStateLock) 
                mCharacteristics = characteristics;
                mCameraId = cameraId;
            
            return true;
        
     catch (CameraAccessException e) 
        e.printStackTrace();
    

    // If we found no suitable cameras for capturing Faces, warn the user.
    ErrorDialog.buildErrorDialog("This device doesn't support Face detection").
            show(getFragmentManager(), "dialog");
    return false;

希望以上代码至少可以帮助您确定问题出在您的设备上还是出在您访问相机的方式上。

【讨论】:

感谢您的回答!但我知道相机工作正常,因为我得到了这个输出max_count 16 这意味着我的设备可以计算 16 张脸......第二个事实,在我的应用程序中,我只使用后置摄像头,这意味着它应该检测人脸,因为它是主摄像头......但它仍然没有检测到......真的我是Android的菜鸟。如果您的应用在人脸检测方面取得了成功,您能否向我展示您制作它的这部分代码? 由于我使用与您相同的 googlesamples 项目作为我的工作示例的基础,因此唯一的区别应该是这个模块。您可以尝试交换上面的代码并查看正在激活的代码路径吗?这可以暗示罪魁祸首。 抱歉,我已尝试为自己解决此问题,但再次失败...我不明白您的意思是“查看正在激活哪些代码路径”? 如果你加入上面的模块,它会给你同样的问题吗? 对不起,我是菜鸟...如果我对你的理解正确,我应该在这个模块的代码上方插入(移动)吗??mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);跨度> 【参考方案2】:

在 Play services 8.3 中,Google 引入了 Mobile Vision API。它包括一个易于使用的 API,称为人脸 API,可检测图像和视频中的人脸。不要将此与人脸识别混淆,因为人脸 API 目前仅支持检测。

检测人脸

当 API 检测到人脸时,它会作为 Face 对象返回。 Face 对象提供人脸的空间数据,因此您可以 例如,在面部周围绘制边界矩形,或者,如果您使用 脸上的地标,你可以在正确的地方为人脸添加特征 地方,比如给一个人一顶新帽子。

它还带有很酷的方法,例如用户是在微笑 :) 还是在眨眼 ;) 等等。

查看文档和参考以了解更多信息。

    Mobile Vision: Find objects in photos and video, using real-time on-device vision technology. Face API- Google Developers Mobile Vision- Youtube Android developers- Face detection API

希望这会有所帮助:)

【讨论】:

真的不,我已经阅读了所有资源,但是做错了,我没有得到面子......它总是返回 0。这就是我问示例的原因 是的,我试过了……但据我了解,它不适用于 Camera 2 API……照片上有人脸检测示例,但我需要预览。 ..并且没有代码示例如何实现它 查看这些样本:github.com/googlesamples/android-visionFaceTracker- 这个在实时预览中检测到人脸github.com/googlesamples/android-vision/tree/master/… 有些示例也适用于 Camera Api,但不适用于 Camera 2 API

以上是关于谁有关于如何使用 Face Detection Camera 2 API 的资料?的主要内容,如果未能解决你的问题,请参考以下文章

人脸检测库:libfacedetection

dlib cnn_face_detection_model_v1 Python 错误

face detection,landmark, recognition with deeplearning

在 C++ 中反序列化 cnn_face_detection_model_v1

dlib:无法打开 face_landmark_detection_ex 进行阅读?

使用 Google Face Detection ML Kit 在现有照片周围绘制一个框