AVCaptureDevice 上的平滑聚焦斜坡

Smooth focus ramp on AVCaptureDevice

我正在使用 AVCaptureDevice setFocusModeLocked 来实现从 A 点到 B 点的聚焦斜坡。我这样做的方法是将 delta 定义为类似于 0.03 的值,然后重复调用 API 来设置 lensPosition。

   device.setFocusModeLocked(lensPosition: pointA, completionHandler: {[weak self] (time) in
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now(), execute: { [weak self] in

                if pointA == pointB {
                    device.unlockForConfiguration()
                    return
                }

                var beginPoint = fmax(currentLensPosition + delta),Float(0))
                let endPoint = fmin(pointB, Float(1.0))


                self?.focusRampRecursive( beginPoint,
                                          pointB:endPoint,
                                          delta: delta,
                                          device: device)
            })
        })

问题是斜坡不平滑。斜坡发生时可以看到跳跃。我怎样才能让它顺利?

有几种方法。

(1)减少重复调用函数的时间间隔。只有缓慢的呼叫才会产生视觉上明显的效果,如果它足够快,人类就不会注意到,例如你的灯以 50hz 的频率闪烁,你认为它一直亮着

(2)将增量减小到更小的值。这样即使他们之间的时间很长,但每次的变化都很少。所以眼睛也看不到

(3) 使用其他非线性映射函数,如exp或log函数。而不是调用线性添加的斜坡。其他 exp 或 log 可能更好,因为 A 到 B 通常不是线性映射的。在视觉不太敏感的区域,移动得更快,在视觉敏感区域,移动得更慢。嗯,我该怎么形容呢。我能想到的最接近的插图是立体视觉。在更近的范围内,你实际上有更多的离散级别来表示。在远距离范围内,表示的离散级别较低。同样的苹果作为焦点。

您体验这一点的 ezist 方式是 运行 v4l2ucp with chesse in ubuntu。将焦点从一侧拖到另一侧。你会发现近距离变化很大,从中到远变化很小