如何通过 android 的 camera2 中的代码更改焦点?
How to chang focus by code in camera2 of android?
我想在 android 的相机应用程序中实现一个功能,我可以单击一个按钮,然后获得 2 张不同焦点的照片(不是手动对焦功能)。
除了我的focus change部分不行运行,我都补齐了,找不到原因,尝试分析一下:
尝试1:我使用 and this中的焦点控制代码来改变焦点,但是没有用。
摄像头制作套件部分:
private CaptureRequest.Builder initDngBuilder() {
CaptureRequest.Builder captureBuilder = null;
try {
captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureBuilder.addTarget(mImageReader.getSurface());
captureBuilder.addTarget(surface);
// Required for RAW capture
captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0.1f);
captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2));
captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2);
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90);
CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
String cameraid = CameraCharacteristics.LENS_FACING_FRONT + "";
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid);
Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]);
} catch (CameraAccessException e) {
Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show();
} catch (NullPointerException e) {
Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show();
}
return captureBuilder;}
private CaptureRequest.Builder initDngBuilder2() {
CaptureRequest.Builder captureBuilder = null;
try {
captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureBuilder.addTarget(mImageReader.getSurface());
captureBuilder.addTarget(surface);
// Required for RAW capture
captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 100.0f);
captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2));
captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2);
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90);
CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
String cameraid = CameraCharacteristics.LENS_FACING_FRONT + "";
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid);
Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]);
} catch (CameraAccessException e) {
Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show();
} catch (NullPointerException e) {
Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show();
}
return captureBuilder;
}
点击监听部分:
private View.OnClickListener picOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
mCameraSession.capture(initDngBuilder().build(), null, mHandler);
mCameraSession.capture(initDngBuilder2().build(), null, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}};
尝试 2:我想弄清楚我的 android 设备是否没有能力(我认为这一点是因为:),所以我使用:
int[] ints = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
for (int i = 0; i < ints.length; i++){
Log.d(TAG, ints[i] + ",");
}
而我只得到了:“0,”。
这是否意味着设备没有 'MANUAL_SENSOR' 的能力?
是的,如果REQUEST_AVAILABLE_CAPABILITIES的内容只包含BACKWARD_COMPATIBLE(0),那么设备不支持MANUAL_SENSOR。
因此,不支持将 LENS_FOCUS_DISTANCE 设置为 0.0f(无限远焦点)以外的任何值。
我想在 android 的相机应用程序中实现一个功能,我可以单击一个按钮,然后获得 2 张不同焦点的照片(不是手动对焦功能)。
除了我的focus change部分不行运行,我都补齐了,找不到原因,尝试分析一下:
尝试1:我使用
摄像头制作套件部分:
private CaptureRequest.Builder initDngBuilder() { CaptureRequest.Builder captureBuilder = null; try { captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureBuilder.addTarget(mImageReader.getSurface()); captureBuilder.addTarget(surface); // Required for RAW capture captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON); captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF); captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF); captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0.1f); captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2)); captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90); CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); String cameraid = CameraCharacteristics.LENS_FACING_FRONT + ""; CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid); Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]); } catch (CameraAccessException e) { Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show(); } catch (NullPointerException e) { Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show(); } return captureBuilder;} private CaptureRequest.Builder initDngBuilder2() { CaptureRequest.Builder captureBuilder = null; try { captureBuilder = mCameraSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureBuilder.addTarget(mImageReader.getSurface()); captureBuilder.addTarget(surface); // Required for RAW capture captureBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON); captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF); captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF); captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 100.0f); captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) ((214735991 - 13231) / 2)); captureBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (10000 - 100) / 2); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90); CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); String cameraid = CameraCharacteristics.LENS_FACING_FRONT + ""; CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraid); Range<Integer> fps[] = cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fps[fps.length - 1]); } catch (CameraAccessException e) { Toast.makeText(getActivity(), "reject", Toast.LENGTH_SHORT).show(); } catch (NullPointerException e) { Toast.makeText(getActivity(), "fail", Toast.LENGTH_SHORT).show(); } return captureBuilder;
}
点击监听部分:
private View.OnClickListener picOnClickListener = new View.OnClickListener() { @Override public void onClick(View view) { try { mCameraSession.capture(initDngBuilder().build(), null, mHandler); mCameraSession.capture(initDngBuilder2().build(), null, mHandler); } catch (CameraAccessException e) { e.printStackTrace(); } }};
尝试 2:我想弄清楚我的 android 设备是否没有能力(我认为这一点是因为:
int[] ints = mCameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
for (int i = 0; i < ints.length; i++){
Log.d(TAG, ints[i] + ",");
}
而我只得到了:“0,”。 这是否意味着设备没有 'MANUAL_SENSOR' 的能力?
是的,如果REQUEST_AVAILABLE_CAPABILITIES的内容只包含BACKWARD_COMPATIBLE(0),那么设备不支持MANUAL_SENSOR。
因此,不支持将 LENS_FOCUS_DISTANCE 设置为 0.0f(无限远焦点)以外的任何值。