Camera2预览正常但拍摄图像模糊且存在条带伪影问题
问题分析与解决方案
针对拍摄图像模糊的问题
- 校验对焦距离有效性:Camera2 API中
LENS_FOCUS_DISTANCE是归一化值(0代表无限远,1代表最近对焦距离),必须确保从CameraSettings获取的数值在当前相机硬件的有效范围内。可以通过CameraCharacteristics的LENS_INFO_MINIMUM_FOCUS_DISTANCE和LENS_INFO_INFINITE_FOCUS_DISTANCE来校验,传值超出范围会直接导致对焦失败。 - 调整AF模式切换时序:当前代码先设置
AF_TRIGGER_IDLE再关闭AF模式,逻辑顺序有问题。正确流程应该是先关闭自动对焦,再设置对焦距离,最后重置AF触发状态,避免镜头还没完成状态切换就被设置参数。 - 等待镜头对焦到位:设置
LENS_FOCUS_DISTANCE后,镜头需要时间调整到指定位置,不能立刻触发拍照。可以监听CaptureResult中的LENS_STATE_FOCUSED_SNAPSHOT状态,或者等待2-3帧后再发送拍摄请求。
针对条带伪影的问题
- 解决AE锁与防频闪的冲突:代码中同时开启
CONTROL_AE_LOCK和ANTIBANDING_MODE_AUTO会导致防频闪失效——AE锁固定了曝光参数(包括快门速度),而自动防频闪需要调整快门速度匹配市电频率(50Hz/60Hz),不匹配就会出现横纹。建议:- 要么关闭
CONTROL_AE_LOCK,让AE和防频闪正常协同工作; - 要么先设置
ANTIBANDING_MODE为对应市电频率的固定值(比如CONTROL_AE_ANTIBANDING_MODE_50HZ或60HZ),再开启AE锁。
- 要么关闭
- 保持预览与拍照参数一致:拍照的
CaptureRequest尽量基于预览的request构建,避免突然修改AE、防频闪等参数,减少曝光不匹配导致的伪影。
调整后的代码示例
Float focusDistance = CameraSettings.getInstance().getFocusDistance(); CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); // 校验对焦距离有效性(如果PreviewActivity传的是实际物理距离,需转归一化值) float minFocus = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE); focusDistance = focusDistance / minFocus; // 实际距离转归一化值,根据实际场景调整 // 先关闭自动对焦模式 captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF); // 设置指定对焦距离 captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, focusDistance); // 重置AF触发状态 captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE); // 配置防频闪与AE锁(以50Hz市电环境为例) captureBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_50HZ); // 若需要AE锁,建议先等待AE参数稳定后再开启 captureBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
内容的提问来源于stack exchange,提问作者Alejandro Medina Baeza
相关产品推荐
相关产品推荐

