我正在使用 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 方法是在 ubuntu 中运行 v4l2ucp 和 chesse。将焦点从一侧拖动到另一侧。你会发现近距离时变化很大,中远时变化很小
关于ios - AVCaptureDevice 上的平滑焦点渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56144752/