4. 全局搜索策略:全局扫描原理、步长选择策略、粗扫与精扫结合、实际场景中的性能瓶颈

全局搜索,说白了就是让镜头从近端走到远端,把每个位置的图像清晰度都算一遍。听起来很笨,对吧?但它是所有智能搜索策略的“地基”。你想想看,如果连全局的清晰度曲线长什么样都不知道,那些花哨的爬山算法、二分法,很容易掉进局部极值的坑里。

我个人习惯把全局搜索叫做“摸底考试”。它不追求速度,只追求一件事——找到全局最清晰的那个点。这一节,我们就来聊聊怎么把这个“摸底”做得又快又准。

4.1 全局扫描原理

原理其实很简单:镜头从起始位置(通常是微距端)开始,按照固定的步长一步一步往前走。每走一步,就抓一帧图像,算一个清晰度评价值(比如我们之前讲的Tenengrad、Laplacian)。走完整个行程后,我们就得到了一条“位置-清晰度”曲线。

这条曲线的最高点,就是我们要找的对焦位置。

核心公式:

扫描范围 = 镜头总行程(Macro → Infinity)

扫描步数 = 扫描范围 / 步长

总耗时 = 扫描步数 × (镜头移动时间 + 图像采集时间 + 清晰度计算时间)

我在项目中遇到过一个问题:有些模组的镜头总行程是 1000 步,但实际有效的清晰范围可能只有 200 步。如果傻傻地从头扫到尾,大部分时间都浪费在模糊区域了。所以,聪明的做法是先确定一个“有效扫描区间”。

4.2 步长选择策略

步长是全局搜索里最关键的参数。选大了,可能错过峰值;选小了,速度慢得让人抓狂。

步长的选择,本质上取决于镜头的“景深”。景深越浅,步长就要越小。我给大家一个经验公式:

// 步长估算
step_size = DOF * 0.8

// 其中 DOF (Depth of Field) 是镜头在当前光圈下的景深
// 0.8 是一个安全系数,防止刚好落在峰值两侧

举个例子:

镜头类型 光圈 (F#) 景深 (DOF) 推荐步长 扫描步数 (总行程1000)
手机广角 F/2.0 ~15 步 12 步 ~83 步
手机长焦 F/2.8 ~8 步 6 步 ~167 步
监控摄像头 F/1.6 ~20 步 16 步 ~63 步

我的小技巧: 如果时间允许,我会先做一次“粗扫”来估算景深。比如用 50 步的步长快速扫一遍,找到峰值的大概位置,然后根据峰值附近的曲线斜率,反推实际的景深范围。这样就能动态调整步长,而不是死记硬背一个固定值。

4.3 粗扫与精扫结合

这是全局搜索里最实用的策略。说白了就是:先用大步子快速找到“大概位置”,再用小步子精确锁定“最佳位置”。

流程是这样的:

  1. 粗扫阶段: 步长设为景深的 2~3 倍。快速扫描整个区间,找到清晰度最高的那个位置(记为 P_rough)。
  2. 精扫阶段: 以 P_rough 为中心,左右扩展一个景深范围。步长缩小到景深的 0.3~0.5 倍。在这个小范围内精细扫描。
  3. 峰值拟合: 对精扫得到的几个点做抛物线拟合,找到亚步长精度的峰值位置。

我曾经在一个项目中,用纯粗扫(步长 20)找到了大概位置,然后精扫(步长 3)只扫了 15 步。总步数从原来的 100 步降到了 35 步,速度提升了近 3 倍,精度反而更高了。

注意: 粗扫的步长不能太大。如果步长超过了景深的 3 倍,很可能直接跳过峰值区域。我见过一个案例,粗扫步长设了 50 步,结果峰值刚好落在两个采样点中间,两个点的清晰度都很低,导致精扫阶段找错了方向。嗯,这种坑踩过一次就不会再犯了。

4.4 实际场景中的性能瓶颈

理论讲完了,咱们聊聊现实。全局搜索在实际落地时,有几个绕不开的瓶颈:

  • 速度瓶颈: 这是最直接的。每走一步都要等镜头稳定、抓图、算清晰度。如果场景光线暗,曝光时间变长,速度就更慢了。我曾经在暗光环境下做过测试,单步耗时从 30ms 飙升到 200ms,全局扫描一次要 20 秒,用户早就不耐烦了。
  • 功耗瓶颈: 镜头频繁来回移动,VCM(音圈马达)的功耗不容小觑。尤其是在电池供电的设备上,连续做几次全局搜索,电量肉眼可见地往下掉。
  • 运动模糊: 如果被摄物体在动,或者手持设备在抖,不同位置采集到的图像内容可能不一样。这会导致清晰度曲线出现“假峰值”。我遇到过最离谱的一次,全局扫描出来的峰值位置,居然是一个移动的树叶——它刚好在某个位置停了一下,清晰度就高了。
  • 温度漂移: 镜头模组在工作时会发热,导致镜片位置发生微小的热膨胀。同一个物理位置,冷机和热机时的清晰度可能不一样。这个问题在户外阳光下尤其明显。

避坑指南: 我曾经在一个安防项目中,发现白天和晚上的最佳对焦位置差了 30 多步。排查了很久才发现,是红外滤光片切换时,光路发生了变化。从那以后,我每次做全局搜索都会加一个“滤光片状态”的标记,不同状态下分别做校准。

下面这张图,是我自己总结的全局搜索策略决策流程,希望能帮你理清思路:

全局搜索策略决策流程 开始全局搜索 是否已知景深 (DOF)? 是 直接计算步长 否 先做粗扫估算 粗扫:大步长扫描 找到粗扫峰值 P_rough 精扫:小步长扫描 P_rough 邻域 抛物线拟合 → 亚步长精度 输出最终对焦位置 步长 = DOF × 0.8 (精扫) 步长 = DOF × 2.5 (粗扫)

最后说一句,全局搜索虽然慢,但它是最可靠的。在产线校准、首次对焦、或者场景剧烈变化时,我都会强制做一次全局搜索。等拿到了可靠的曲线数据,后续的快速搜索才能放心地“偷懒”。