如何在 camera2 API 中触发手动自动对焦?
How to trigger manual autofocus in camera2 API?
已弃用的相机 API 为 Camera 对象提供了函数 autofocus()
,我们可以在检测到 frames/images 后增加 preview/capture 的焦点很模糊。
现在我们更新了我们的应用程序以使用 camera2 API 并且仍在尝试弄清楚我们如何手动触发相机自动对焦。对于预览的初始化,我们使用以下代码:
// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
try {
// Auto focus should be continuous for camera preview.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// Flash is automatically enabled when necessary.
setAutoFlash(mPreviewRequestBuilder);
// Finally, we start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
稍后在分析图像质量时访问捕获帧时,如果它太模糊,我们想再次触发自动对焦以提高结果质量:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Log.e(TAG, "Image captured!");
Image image = reader.acquireLatestImage();
float focusScore = analyseImage(image);
if(focusScore < 10) {
// Here we would like to trigger some focus functionality
} else {
// Take the result frame as good enough and proceed
}
image.close();
}
};
更新: 下面的回答也帮助我实现了这个问题的解决方案:link
将 CONTROL_AF_TRIGGER 捕获请求字段设置为 START 以触发自动对焦操作的一个请求。
该动作取决于自动对焦模式;对于连拍模式,如果认为已经对焦,AF 通常会被锁定。如果 AF 没有收敛,它会尝试快速收敛然后锁定 AF。锁定一直持续到 AF_TRIGGER 被设置为 CANCEL 对于一个请求(或 AF 模式被更改)。
因此,如果您想触发完整的 AF 扫描,您可能需要切换到 AF_MODE_AUTO 然后再触发,因为连续对焦触发不一定会重新扫描场景。
已弃用的相机 API 为 Camera 对象提供了函数 autofocus()
,我们可以在检测到 frames/images 后增加 preview/capture 的焦点很模糊。
现在我们更新了我们的应用程序以使用 camera2 API 并且仍在尝试弄清楚我们如何手动触发相机自动对焦。对于预览的初始化,我们使用以下代码:
// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
try {
// Auto focus should be continuous for camera preview.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// Flash is automatically enabled when necessary.
setAutoFlash(mPreviewRequestBuilder);
// Finally, we start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
稍后在分析图像质量时访问捕获帧时,如果它太模糊,我们想再次触发自动对焦以提高结果质量:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Log.e(TAG, "Image captured!");
Image image = reader.acquireLatestImage();
float focusScore = analyseImage(image);
if(focusScore < 10) {
// Here we would like to trigger some focus functionality
} else {
// Take the result frame as good enough and proceed
}
image.close();
}
};
更新: 下面的回答也帮助我实现了这个问题的解决方案:link
将 CONTROL_AF_TRIGGER 捕获请求字段设置为 START 以触发自动对焦操作的一个请求。
该动作取决于自动对焦模式;对于连拍模式,如果认为已经对焦,AF 通常会被锁定。如果 AF 没有收敛,它会尝试快速收敛然后锁定 AF。锁定一直持续到 AF_TRIGGER 被设置为 CANCEL 对于一个请求(或 AF 模式被更改)。
因此,如果您想触发完整的 AF 扫描,您可能需要切换到 AF_MODE_AUTO 然后再触发,因为连续对焦触发不一定会重新扫描场景。