在AVCaptureDevice上平滑对焦

时间:2019-05-15 08:26:32

标签: ios avfoundation avcapturesession avcapturedevice

我正在使用AVCaptureDevice setFocusModeLocked实现从点A到点B的聚焦渐变。我的方式是将增量定义为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 个答案:

答案 0 :(得分:1)

有几种方法。

(1)缩短了重复调用该函数的时间间隔。只有慢速通话才能产生视觉上的明显效果,如果速度足够快,人们将无法察觉,例如您的灯光以50hz的频率闪烁并且您认为它一直亮着

(2)将增量减小为较小的值。因此,即使他们之间的时间很大,但每次变化很少。所以眼睛也不会注意到

(3)使用其他非线性映射函数,例如exp或log函数。而不是调用线性添加的斜坡。其他exp或log可能更好,因为A到B通常不是线性映射的。在视觉不太敏感的区域,移动较快;在视觉敏感的区域,移动较慢。嗯,我该怎么形容。我能想到的最接近图示的是立体视觉。在更近的范围内,实际上您可以代表更多的离散水平。在较远的范围内,表示的离散程度较小。相同的苹果成为焦点。

让您体验到这一点的ezist方式是在ubuntu中使用国际象棋运行v4l2ucp。将焦点从一侧拖到另一侧。您会发现在近距离处它变化很大,从中到远,变化很小。