Я создал приложение для компьютерного зрения для Android. Я использую фронтальную камеру для захвата изображений, на которых я применяю свои алгоритмы. На моем Samsung Galaxy S8 я заметил, что когда я помещаю предметы перед камерой, фокусное расстояние изменяется с автофокусом (он продолжает увеличивать и уменьшать масштаб). Это проблема, потому что это создает нежелательные изменения в изображении, которые меняют мой алгоритм. Как определить разумное значение фокусного расстояния, а затем заставить датчик фиксировать его, не отключая автофокус?
Вот мой код для настройки захвата камеры.
private void createCameraPreviewSession() throws CameraAccessException {
mCameraDevice.createCaptureSession(Arrays.asList(mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
if (null == mCameraDevice) {
return;
}
mCaptureSession = cameraCaptureSession;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler);
} catch (Exception e) {
Log.e(Config.tag, "createCaptureSession failed", e);
}
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
Log.e(Config.tag, "createCameraPreviewSession failed");
}
},
null
);
}
private void createImageReader() throws CameraAccessException
{
mImageReader = ImageReader.newInstance(mFrameSize.getWidth(), mFrameSize.getHeight(),
mPreviewFormat, 2);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
if (mCaptureSession == null) {
return;
}
Image image = reader.acquireLatestImage();
if (image == null) {
return;
}
//do something with the image
image.close();
}
}, mBackgroundHandler);
Surface surface = mImageReader.getSurface();
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
}