Поэтому мне нужно сделать несколько снимков с помощью серийной съемки, одна с фокусом над центром, а другая с фокусом под центром. Я модифицировал код 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();
}
}