041、闭环 AF 的对焦算法:爬山搜索、相位检测与混合对焦的工程实现
041、闭环 AF 的对焦算法:爬山搜索、相位检测与混合对焦的工程实现
一、从一次“拉风箱”的现场调试说起
去年夏天,我在某款旗舰机型的预研阶段,遇到了一个让人头皮发麻的问题:相机在暗光下对焦时,马达像抽风一样来回往复运动,画面忽明忽暗,持续两三秒才勉强锁住。更诡异的是,同样的算法在实验室的评估板上跑得稳稳当当,一上整机就翻车。
我盯着log看了整整两天,发现爬山搜索的步长在低对比度场景下被错误地放大了——因为ISP的统计窗口恰好落在了一片纯色区域,对比度梯度几乎为零,算法误以为“还没到峰顶”,于是继续大步向前推,直到撞上机械限位才回头。这就是典型的“爬山算法在平坦区失效”案例。
后来我加了一招:在每次爬山启动前,先做一次快速的“预扫描”,用粗步长探测整个对焦范围,找到对比度有明显起伏的区域,再缩小步长精细搜索。这个改动看似简单,但解决了80%的拉风箱问题。剩下的20%,靠的是相位检测的介入。
二、爬山搜索:别把它当“万能钥匙”
爬山搜索(Hill Climbing)是闭环AF最基础的算法,核心思想很简单:移动镜头,计算当前帧的对比度值(通常用Tenengrad或Laplacian梯度),如果比上一帧大,说明方向对了,继续走;如果变小,说明过了峰顶,回头找。
但工程实现里全是坑。
坑1:步长怎么定?
步长太大,容易跳过峰顶,导致来回震荡;步长太小,对焦慢得像蜗牛。我的做法是动态步长:在对比度梯度大的区域用细步长,梯度小的区域用粗步长。
