Java 谁有关于如何使用人脸检测摄像头2 API的资料?

Java 谁有关于如何使用人脸检测摄像头2 API的资料?,java,android,camera,android-camera,Java,Android,Camera,Android Camera,官方消息来源没有找到信息。。。有很多关于如何使用CameraAPI的例子,但是如何使用Camera2API任何东西。。。一对夫妇的讨论在利害关系和所有。。。我有一个类似的问题,但我有一个问题没有解决 链接到同一问题: 我以为例 我就是这么做的,但我没有发现一张脸: 我添加了一些事件 private void createCameraPreviewSession() { try { SurfaceTexture texture = mTextureView.get

官方消息来源没有找到信息。。。有很多关于如何使用CameraAPI的例子,但是如何使用Camera2API任何东西。。。一对夫妇的讨论在利害关系和所有。。。我有一个类似的问题,但我有一个问题没有解决

链接到同一问题:

我以为例

我就是这么做的,但我没有发现一张脸:

我添加了一些事件

    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

为什么不重新修饰脸?如果有人有一个正确的工作exsample,请提供一个链接。如何使用camera2API进行人脸检测。整个星期,我都无法理解((

通过play services 8.3,谷歌推出了移动视觉API。它包括一个名为Face API的易于使用的API,用于检测图像和视频中的人脸。不要将此与人脸识别混淆,因为Face API目前只支持检测

检测人脸

当API检测到人脸时,它将作为人脸对象返回。 面对象为面提供空间数据,以便您可以 例如,围绕面绘制边界矩形,或者,如果使用 面上的地标,可以以正确的方式向面添加特征 放置,例如给某人一顶新帽子

它还提供了一些很酷的方法,比如用户是在微笑:)还是在眨眼;)等等

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

  • 希望这有帮助:)

    Aleksey

    您的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;
    }
    

    希望上述代码至少能帮助您确定问题是出在您的设备上还是出在您访问摄像头的方式上。

    您是否阅读了此处的android开发者信息:?是的,但它只是一般性的描述。。。它如何在人脸检测摄像头2 API中阻止我?这些有帮助吗?1) (2)(3)堆栈溢出仅为英文。我不知道你问题中的俄语是什么意思,你能用英语吗?如果你使用英语,你也更有可能得到一个好的答案。你好,阿列克西·蒂莫申科,我也遇到了同样的问题。你找到解决这个问题的方法了吗?真的没有,我已经阅读了所有的参考资料,但是smth做错了,我没有得到面子。。。它总是返回0。这就是为什么我要问这个例子是的,我试过了。。。但据我所知,它不适用于Camera 2 API。。。照片上有人脸检测样本,但我需要预览。。。并且没有代码示例如何实现这些示例:FaceTracker-这是一个在实时预览中检测人脸的示例还有一些示例也适用于Camera Api,而不是Camera 2 Api谢谢您的回答!但我知道相机工作正常,因为我得到了这个输出
    max_count 16
    这意味着我的设备可以计数16张脸。。。第二个事实是,在我的应用程序中,我只使用后摄像头,这意味着它应该检测人脸,因为它是主摄像头。。。但它仍然没有检测到。。。真的,我是安卓系统的新手。如果你在人脸检测应用程序中取得了成功,你能告诉我这部分代码是在哪里制作的吗?因为我使用了与你相同的googlesamples项目作为我工作示例的基础,唯一的区别应该是在这个模块中。您能否尝试在上面的代码中进行交换,并查看哪些代码路径正在被激活?这可能会给罪犯一个暗示。很抱歉,我试图自己解决这个问题,但还是没有成功。。。我没有完全理解你所说的“查看哪些代码路径正在被激活”是什么意思?如果你在上面的模块中加入,它会给你带来同样的问题吗?对不起,我是新手。。。如果我理解正确,我是否应该在代码上方插入(移动)此模块?mPreviewRequestBuilder.set(CaptureRequest.STATISTICS\u FACE\u DETECT\u MODE,CameraMetadata.STATISTICS\u FACE\u DETECT\u MODE\u FULL);