AF(自动对焦)是 Camera 调优中最复杂的模块之一。用户对”对不上焦”、”对焦慢”、”跑焦”的容忍度极低——一张模糊的照片基本等于废片。
这篇文章基于高通 Camx 框架,梳理 AF 对焦的完整流程和调试方法。重点是实战日志分析和异常 case 排查,不只是讲原理。
一、AF 对焦基本原理
1.1 三种核心对焦方案
| 方案 | 原理 | 速度 | 适用 |
|---|---|---|---|
| PDAF | 相位检测 | 快 | 需要 sensor 支持 PDAF 像素 |
| CDAF | 反差检测 | 慢 | 所有 sensor 都支持 |
| HAF | 混合对焦 | 快+准 | 主流方案(高通) |
PDAF(Phase Detection Auto Focus)
通过 sensor 上特殊的像素(遮光像素)获取左右眼图像的相位差,直接计算出对焦距离。优点是速度快,缺点是需要 sensor 支持。
CDAF(Contrast Detection Auto Focus)
通过评估图像的清晰度(对比度)来判断是否对焦准确。优点是不需要特殊像素,缺点是速度慢——需要反复移动对焦马达寻找最清晰的点。
HAF(Hybrid Auto Focus)
结合 PDAF 和 CDAF,先用 PDAF 快速接近对焦位置,再用 CDAF 微调。这是目前主流手机采用的方案。
1.2 AF 关键概念
• Focus Position:对焦马达位置,通过 VCM(音圈马达)控制
• Confidence:PDAF 计算的置信度,越高越可信
• Progress:对焦进度,100 表示对焦完成
• Range Near/Far:对焦搜索范围
二、Camx AF 对焦流程
2.1 整体流程
App 发送对焦请求
↓
Camera2 Framework
├── 设置 AF trigger
├── 设置 AF region(对焦区域)
└── 设置 AF mode(AUTO/MACRO/CONTINUOUS)
↓
Camx HAL
├── STATS 节点:接收 sensor 统计数据
├── AF 算法节点(af_haf.cpp):计算对焦位置
│ ├── PDAF 计算 → 得到相位差 → 计算 defocus 距离
│ └── CDAF 计算 → 评估对比度 → 微调位置
├── AEC 节点:AE 收敛后再触发 AF
└── Actuator 节点:控制 VCM 马达移动
↓
Driver
└── 写 VCM 寄存器 → 马达移动到目标位置
2.2 AF 状态机
INACTIVE → ACTIVE_SCAN → FOCUSED_LOCKED
↘ NOT_FOCUSED_LOCKED
• INACTIVE:AF 未激活
• ACTIVE_SCAN:正在搜索对焦位置
• FOCUSED_LOCKED:对焦成功并锁定
• NOT_FOCUSED_LOCKED:对焦失败并锁定
调试技巧:看到
NOT_FOCUSED_LOCKED频繁出现,说明对焦逻辑有 bug。如果一直停在ACTIVE_SCAN,说明搜索过程卡住了。
三、AF 调试日志分析(重点)
3.1 开启 AF Debug 日志
修改文件:camxoverridesettings.txtlogVerboseMask=0x08000000
推送方式adb push camxoverridesettings.txt vendor/etc/camera/
adb shell reboot
说明:
0x08000000是 STATS_AF 模块的 verbose 日志 mask。开启后会输出 AF 算法的详细过程日志。
3.2 典型对焦过程日志
搜索命令logcat | grep “STATS_AF”
典型日志输出CamX: [VERB][STATS_AF] af_haf.cpp:2036: af_haf_focus_converge HAF_CONVERGE_STATUS: 2
CamX: [VERB][STATS_AF] af_haf.cpp:2043: af_haf_focus_converge Output:
progress = 100,
next_pos = 311,
range_near = 0,
range_far = 399,
confidence = 100
CamX: [VERB][STATS_AF] af_haf.cpp:2049: af_haf_focus_converge AF_HAF_SEARCH_DONE:
日志字段解读
| 字段 | 含义 | 正常值 |
|---|---|---|
| HAF_CONVERGE_STATUS | 对焦收敛状态 | 2=收敛成功 |
| progress | 对焦进度 | 100=完成 |
| next_pos | VCM 下一步目标位置 | 马达行程范围内的值 |
| range_near | 搜索范围下限 | 0 |
| range_far | 搜索范围上限 | 399(取决于 VCM 型号) |
| confidence | PDAF 置信度 | 越高越好,100 为最高 |
| AF_HAF_SEARCH_DONE | 搜索完成标志 | 出现表示一轮对焦结束 |
四、4 个常见对焦问题排查
问题1:对焦不收敛
现象:HAF_CONVERGE_STATUS 持续为 0 或 1(搜索中),progress 一直不到 100。
排查方向
• 检查 PDAF 标定数据是否正确
• 检查 VCM 驱动 IC 配置是否正确
• 检查 AF 搜索范围是否合理
问题2:Confidence 偏低
现象:confidence 持续偏低(< 50)。
排查方向
• PDAF 像素标定有问题
• sensor 的 PDAF 像素被遮挡
• 环境光线太暗
问题3:next_pos 异常
现象:next_pos 在 0 或 399(极限位置)徘徊。
排查方向
• VCM 行程配置不对
• AF 搜索范围设置太窄
问题4:对焦速度慢
现象:从触发对焦到 FOCUSED_LOCKED 耗时过长(> 1s)。
排查方向
• AE 是否先收敛(AF 依赖 AE 收敛)
• PDAF 标定数据精度
• VCM 响应速度(驱动电流是否足够)
五、实用调试技巧
5.1 确认 VCM 是否正常工作
方法1:dump VCM 寄存器adb shell “echo 0x0A00 > /sys/kernel/debug/camera/sensor/vcm_reg && cat /sys/kernel/debug/camera/sensor/vcm_reg”
方法2:日志确认logcat | grep -i “actuator|vcm|dac”
5.2 确认 PDAF 数据是否正常
logcat | grep -i “pdaf|phase”
正常情况下应该能看到 PDAF 数据统计日志。如果没有,说明 PDAF 配置有问题。
速查表
| 问题 | 关键日志 | 排查方向 |
|---|---|---|
| 对焦不收敛 | HAF_CONVERGE_STATUS=0/1 | PDAF 标定、VCM 驱动 |
| Confidence 偏低 | confidence<50 | PDAF 标定、光线 |
| next_pos 异常 | next_pos=0/399 | VCM 行程、搜索范围 |
| 对焦慢 | 耗时>1s | AE 收敛、PDAF 精度 |
AF 调试的关键是看懂日志。每条日志字段背后都对应着一个具体的算法步骤,结合现象对照排查,效率会高很多。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。