4、搜索策略概述:爬山法、全局搜索、混合搜索、无穷远/微距触发策略

自动对焦的搜索策略,说白了就是镜头该怎么动才能找到最清晰的那个点。高通平台给了我们好几种选择,每种都有自己的脾气。我这些年调过的项目里,几乎每个案子都要在这几种策略里做组合,很少有只用一种策略就能搞定的情况。

先看一张总览图,把这几种策略的关系理清楚:

自动对焦搜索策略体系 AF 搜索策略 爬山法 (Hill Climbing) 全局搜索 (Full Search) 混合搜索 (Hybrid) 粗步 → 细步 局部极值风险 遍历所有位置 耗时最长 全局粗搜 + 爬山细搜 业界主流方案 触发策略:无穷远 / 微距 无穷远触发 微距触发

4.1 爬山法:最经典的局部搜索

爬山法的思路很直观——往清晰度值变大的方向走,直到找到峰值。高通平台里,爬山法是最基础的搜索方式,也是我最早接触的AF算法。

它的工作流程大致是这样:

  1. 确定起始位置:通常是当前镜头位置,或者预设的起始点。
  2. 迈出第一步:朝一个方向移动固定步长,计算清晰度值。
  3. 比较判断:如果清晰度变大了,继续朝同方向走;如果变小了,掉头。
  4. 步长切换:找到大致方向后,步长减半做细搜。
  5. 收敛判定:连续几次清晰度不再提升,或者出现下降,就认为找到了峰值。

核心要点:爬山法只保证找到局部最优,不保证全局最优。如果镜头初始位置选得不好,很容易爬到一个小山坡上就停了。

我在项目中遇到过一个问题:某个场景下,爬山法总是停在离真正焦点差十几步的位置。后来发现是步长设置太大,细搜阶段没有充分探索。嗯,这里要注意——步长的衰减策略很关键,衰减太快容易错过峰值,衰减太慢又浪费时间。

4.2 全局搜索:地毯式排查

全局搜索就简单粗暴了——从镜头的一端走到另一端,每个位置都算一遍清晰度,最后挑出最大值对应的位置。说白了,这就是穷举法。

高通平台里,全局搜索通常用在初始化阶段,或者场景发生剧烈变化时。它的优点是不会漏掉全局最优,缺点嘛,你想想看——如果镜头行程有1000步,每一步都要算清晰度,那耗时可就大了。

对比项 爬山法 全局搜索
搜索范围 局部区域 全行程
耗时 短(几十步) 长(几百到上千步)
最优性 局部最优 全局最优
适用场景 连续对焦、追踪 初始化、场景切换

避坑提醒:我曾经在一个项目中,全局搜索的步长设成了1步,结果每次对焦都要花2秒多。后来改成先粗搜(步长8步)再细搜(步长1步),时间降到了400毫秒以内。全局搜索不是不能用,但要控制采样密度。

4.3 混合搜索:取长补短

混合搜索是目前高通平台上的主流方案。它的思路很简单——先用全局搜索做粗定位,再用爬山法做精确定位。这样既保证了全局最优性,又控制了整体耗时。

我个人的习惯是这么配置混合搜索的参数:

  • 粗搜阶段:步长设为镜头全行程的5%-10%,采样点控制在20-30个。
  • 细搜阶段:步长设为粗搜步长的1/4到1/8,收敛阈值设得严一些。
  • 边界处理:如果粗搜找到的峰值在边界附近,要扩展搜索范围。

实战技巧:混合搜索的粗搜步长不是固定的。我习惯根据场景动态调整——光线好的时候步长大一些,光线差的时候步长小一些。因为暗光下清晰度曲线比较平缓,步长太大容易错过峰值。

4.4 无穷远/微距触发策略

这个策略解决的是「什么时候该触发对焦」的问题。高通平台里,无穷远和微距是两个特殊的触发条件。

无穷远触发:当场景中的主体距离镜头超过某个阈值(比如5米以上),系统直接跳到无穷远位置,不做搜索。为什么?因为这时候不管怎么搜,结果都差不多是无穷远,何必浪费时间去算清晰度呢?

微距触发:当检测到场景中有物体靠近镜头(比如小于10厘米),系统直接跳到微距位置。这个判断通常靠激光传感器或者双摄视差来完成。

我记得有一次调试,用户反馈手机拍近处物体时对焦很慢。查了半天发现是微距触发阈值设得太保守了——15厘米才触发,但很多用户拍文档的距离是20厘米左右。后来把阈值放宽到25厘米,问题就解决了。

触发类型 判断依据 动作 典型阈值
无穷远触发 场景深度 > 阈值 直接跳到无穷远 5m - 10m
微距触发 场景深度 < 阈值 直接跳到微距位置 10cm - 25cm
普通触发 场景深度在中间范围 执行搜索策略 无

注意:无穷远和微距触发不能滥用。我曾经见过一个项目,把无穷远触发阈值设成了3米,结果室内场景经常被误判为无穷远,拍出来的照片都是模糊的。阈值要根据镜头模组的实际景深来标定,不能拍脑袋定。

好了,这几种策略各有各的脾气。爬山法快但不一定准,全局搜准确但慢,混合搜索是折中方案,无穷远/微距触发则是偷懒的技巧。实际项目中,我一般会根据场景动态切换——预览阶段用混合搜索,拍照阶段用爬山法加边界校验,特殊场景用触发策略直接跳转。没有银弹,只有最适合当前场景的方案。