如何使用camera2 API强制焦距为固定值?
How to force the focal length to a fixed value with camera2 API?
我为 Android 创建了一个计算机视觉应用程序。我使用前置摄像头捕捉应用算法的图像。在我的三星 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);
}
我认为使用 CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE 是试图持续保持图像对焦的模式。就我而言,在一些具有多个前置镜头的高端设备上,这可能会导致镜头之间的切换。我刚刚将自动对焦模式更改为 CaptureRequest.CONTROL_AF_MODE_AUTO 并且自动对焦停止不断改变焦点。另外,我使用CaptureRequest.CONTROL_AE_LOCK选项在关键时刻锁定和解锁自动曝光,以避免不必要的曝光变化。
我为 Android 创建了一个计算机视觉应用程序。我使用前置摄像头捕捉应用算法的图像。在我的三星 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);
}
我认为使用 CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE 是试图持续保持图像对焦的模式。就我而言,在一些具有多个前置镜头的高端设备上,这可能会导致镜头之间的切换。我刚刚将自动对焦模式更改为 CaptureRequest.CONTROL_AF_MODE_AUTO 并且自动对焦停止不断改变焦点。另外,我使用CaptureRequest.CONTROL_AE_LOCK选项在关键时刻锁定和解锁自动曝光,以避免不必要的曝光变化。