Использование CONTROL_AF_REGIONS в Camera2 Android - PullRequest
0 голосов
/ 02 июля 2019

Поэтому мне нужно сделать несколько снимков с помощью серийной съемки, одна с фокусом над центром, а другая с фокусом под центром. Я модифицировал код Camera2Basic для этого. Я успешно реализовал пакетный захват. Я также установил CONTROL_AF_REGIONS, но, похоже, он не работает.

Я напечатал возвращенные области фокуса после захвата, и они соответствуют ожиданиям, но само изображение не показывает желаемых изменений, оба изображения одинаковы. Я пытался изменить время экспозиции раньше, и это работает правильно, поэтому проблема должна быть в области фокусировки.

private void captureStillPicture() {
        try {
            final Activity activity = getActivity();
            if (null == activity || null == mCameraDevice) {
                return;
            }
            CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
            CameraCharacteristics in = manager.getCameraCharacteristics(mCameraId);

            final Rect sensorArraySize = in.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
            int height = sensorArraySize.height();
            int width = sensorArraySize.width();
            int centerX = sensorArraySize.centerX();
            int centerY = sensorArraySize.centerY();
            System.out.println(centerY);
            System.out.println(centerX);
            MeteringRectangle focusArea1 = new MeteringRectangle(centerX,
                    centerY + centerY - 30 ,
                    150 * 2,
                    150 * 2,
                    1000);
            MeteringRectangle focusArea2 = new MeteringRectangle(centerX,
                    30,
                    150 * 2,
                    150 * 2,
                    1000);

            CaptureRequest.Builder captureStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            captureStillBuilder.addTarget(mImageReader.getSurface());

            CaptureRequest.Builder captureStillBuilder2 = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            captureStillBuilder2.addTarget(mImageReader.getSurface());

            int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();

            captureStillBuilder.set(CaptureRequest.JPEG_ORIENTATION,
                    ORIENTATIONS.get(rotation));
            captureStillBuilder2.set(CaptureRequest.JPEG_ORIENTATION,
                    ORIENTATIONS.get(rotation));

            CameraCaptureSession.CaptureCallback captureCallback =
                    new CameraCaptureSession.CaptureCallback() {

                        @Override
                        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                            super.onCaptureCompleted(session, request, result);
                            MeteringRectangle s = result.get(CaptureResult.CONTROL_AF_REGIONS)[0];
                            System.out.println(Integer.toString(s.getX()) +"-"+ Integer.toString(s.getY()));
                            unlockFocus();
                        }
                    };

            List<CaptureRequest> list = new ArrayList<>();

            captureStillBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
            captureStillBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
            captureStillBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea1});
            captureStillBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);



            captureStillBuilder2.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
            captureStillBuilder2.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
            captureStillBuilder2.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea2});
            captureStillBuilder2.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);





            list.add(captureStillBuilder.build());
            list.add(captureStillBuilder2.build());

            mCaptureSession.captureBurst(list, captureCallback, null);

        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
...