我正在使用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)
})
})
问题是斜坡不平滑。发生斜坡时会看到跳跃。如何使它平滑?
答案 0 :(得分:1)
有几种方法。
(1)缩短了重复调用该函数的时间间隔。只有慢速通话才能产生视觉上的明显效果,如果速度足够快,人们将无法察觉,例如您的灯光以50hz的频率闪烁并且您认为它一直亮着
(2)将增量减小为较小的值。因此,即使他们之间的时间很大,但每次变化很少。所以眼睛也不会注意到
(3)使用其他非线性映射函数,例如exp或log函数。而不是调用线性添加的斜坡。其他exp或log可能更好,因为A到B通常不是线性映射的。在视觉不太敏感的区域,移动较快;在视觉敏感的区域,移动较慢。嗯,我该怎么形容。我能想到的最接近图示的是立体视觉。在更近的范围内,实际上您可以代表更多的离散水平。在较远的范围内,表示的离散程度较小。相同的苹果成为焦点。
让您体验到这一点的ezist方式是在ubuntu中使用国际象棋运行v4l2ucp。将焦点从一侧拖到另一侧。您会发现在近距离处它变化很大,从中到远,变化很小。