4. AF 常见问题2:对焦不准、跑焦——场景复现与校准策略

对焦不准和跑焦,这两个问题在项目里出现的频率非常高。很多工程师一看到画面模糊,第一反应就是“镜头坏了”或者“马达坏了”。其实,大部分情况是算法参数或者场景条件没匹配好。

我个人习惯把这类问题分成两类:静态对焦不准和动态跑焦。前者是固定场景下对焦结果就是错的,后者是场景变化时对焦跟不上或者来回振荡。定位思路完全不同。

4.1 问题分类与根因分析

先看一个简单的分类表,帮你快速判断属于哪一类:

现象 可能根因 常见场景
画面始终模糊,手动调焦也无效 镜头模组损坏、马达驱动异常、AF 算法未使能 开机后一直模糊
近景清晰,远景模糊(或反之) 无穷远校准偏移、马达行程限位错误 切换远近景时
对焦来回振荡,无法稳定 搜索步长过大、死区设置过小、场景纹理不足 低光照、纯色墙面
对焦结果偏前或偏后 镜头位置校准偏差、温度漂移未补偿 温度变化后
视频中突然模糊又恢复 场景切换触发重新对焦、马达响应滞后 快速移动镜头

嗯,这里要注意:跑焦不一定是硬件问题。我在项目中遇到过好几次,最后发现是 AF 算法的搜索窗口选错了位置——窗口落在背景上,前景的人反而模糊了。

4.2 场景复现:如何稳定复现对焦问题

定位问题之前,先要能稳定复现。很多工程师抱怨“偶尔出现一次,抓不到log”。其实是你没找对方法。

4.2.1 复现环境搭建

我建议准备以下工具:

  • 标准测试图卡:ISO 12233 分辨率卡、西门子星图、对比度图卡
  • 可调光源:色温可调(D65、A光源、TL84),照度可调(10 lux ~ 1000 lux)
  • 固定支架:确保镜头和测试图卡的距离固定,减少人为抖动
  • 温度箱:如果怀疑温度漂移,把设备放进温度箱,从 -10°C 到 60°C 跑一遍
我的小技巧: 复现跑焦问题时,不要只测一次。连续对焦 50 次,记录每次的对焦位置和清晰度评分。如果某次位置偏差超过 10%,基本可以判定有问题。

4.2.2 复现步骤模板

以“近景清晰、远景模糊”为例,标准复现流程:

  1. 将设备固定在支架上,距离测试图卡 30cm,确认近景对焦正常
  2. 将设备移动到距离测试图卡 3m 处,触发 AF
  3. 记录对焦完成后的马达位置和清晰度评分
  4. 重复步骤 1-3 共 10 次
  5. 切换光源照度(100 lux、300 lux、1000 lux),重复上述步骤

为什么要记录清晰度评分?因为有时候画面看起来模糊,但算法认为已经“足够清晰”了——这其实是评分函数设计不合理。

4.3 校准策略:从硬件到软件

校准是解决对焦不准最直接的手段。但校准不是一次性的,需要贯穿整个开发周期。

4.3.1 硬件校准

硬件校准主要解决镜头位置和马达驱动的偏差。常见的校准项:

校准项 方法 典型值
无穷远位置校准 对准无限远目标(如远处的建筑),调整马达位置使清晰度最高 马达步数:800~1200
微距位置校准 对准 10cm 处的图卡,调整马达位置使清晰度最高 马达步数:0~200
马达线性度校准 从微距到无穷远,每隔 100 步记录一次清晰度,拟合曲线 R² > 0.95
温度补偿系数 在不同温度下重复无穷远校准,计算偏移量 0.5~2 步/°C
曾经踩过的坑: 有一款镜头,常温下校准完全正常,但到了 50°C 就开始跑焦。查了三天才发现是马达的驱动电流随温度变化,导致实际行程偏移了 15%。后来加了温度补偿系数才解决。

4.3.2 软件校准策略

软件校准主要针对算法参数。我个人习惯按以下顺序调整:

  1. 调整搜索窗口:窗口应该覆盖主要拍摄对象,避开背景。如果窗口落在背景上,对焦结果肯定偏。
  2. 调整搜索步长:步长太大容易跳过最佳位置,步长太小搜索时间太长。我一般从 10 步开始,根据镜头行程调整。
  3. 调整死区:死区是判断“是否已经对焦完成”的阈值。死区太小会导致振荡,死区太大导致对焦不准。建议用清晰度评分的 5%~10% 作为初始值。
  4. 启用峰值锁定:搜索过程中记录最高清晰度位置,即使后续评分下降,也回退到峰值位置。

说白了,软件校准就是让算法更“聪明”地找到最佳位置,而不是盲目搜索。

4.4 校准流程与验证

下面这张图是我常用的校准和验证流程,你可以直接参考:

AF 校准与验证流程 AF 校准与验证流程 硬件校准 软件参数调整 场景复现测试 通过? 发布 重新校准 说明: 1. 硬件校准和软件参数调整可以并行进行,但建议先完成硬件校准。 2. 场景复现测试需要覆盖至少 3 种光照条件和 5 种距离。 3. 如果连续 3 次测试不通过,需要重新检查硬件模组。

这个流程看起来简单,但执行起来有很多细节。比如“场景复现测试”,不能只测一次就下结论。我一般要求测试人员连续对焦 20 次,记录每次的对焦位置和清晰度评分,然后计算均值和标准差。如果标准差超过 5%,说明算法不稳定。

4.5 常见校准工具与命令

实际调试中,我常用以下工具和命令:

# 读取当前马达位置
cat /sys/class/af/af_position

# 手动设置马达位置(用于校准)
echo 500 > /sys/class/af/af_target

# 触发自动对焦
echo 1 > /sys/class/af/af_trigger

# 读取清晰度评分
cat /sys/class/af/af_sharpness

# 读取温度传感器
cat /sys/class/thermal/thermal_zone0/temp

核心思路: 校准不是一次性的工作。每次更换镜头模组、修改算法参数、或者环境温度变化超过 10°C,都需要重新校准。我建议在产线测试中加入“快速校准”环节,只需要 3 秒就能完成无穷远和微距两个点的校准,大幅降低跑焦概率。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 不要相信“默认参数”:每个镜头模组都有个体差异,默认参数只能保证“能用”,不能保证“好用”。
  • 注意温度漂移:我遇到过一款手机,夏天对焦正常,冬天就偏了。后来发现是镜头材料的膨胀系数没补偿。
  • 检查马达驱动电流:有时候跑焦不是算法问题,是马达驱动电流不够,导致实际行程和理论行程不一致。
  • 不要忽略振动:在车载或无人机场景中,振动会导致对焦结果不稳定。建议在算法中加入“振动检测”,振动时暂停对焦。

嗯,对焦不准和跑焦的问题,说到底就是“位置没找对”。只要你能稳定复现、系统校准,大部分问题都能解决。如果校准后还是有问题,那就要怀疑硬件模组本身了——换一颗镜头试试看。