ios - AVCaptureDevice 上的平滑焦点渐变

标签 ios avfoundation avcapturesession 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 方法是在 ubuntu 中运行 v4l2ucp 和 chesse。将焦点从一侧拖动到另一侧。你会发现近距离时变化很大,中远时变化很小

关于ios - AVCaptureDevice 上的平滑焦点渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56144752/

相关文章:

ios - 使用 AVCaptureSession 以编程方式捕获最高分辨率图像

ios - AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 相同队列

ios - 没有 AVAsset 的纯色的 AVMutableComposition

ios - Swift:展开可选项和 NSNull

javascript - iOS - 删除具有焦点输入元素的 iFrame 保持光标可见和键盘打开

ios - 如何使用 Firestore 中的对象将数据设置为数组

iPhone:用于编辑的音频文件的 NSData 表示

ios - iphone 上相机应用程序的 AVFoundation AVCaptureDevice 设置是什么?

iphone - UIView 框架边界为 0,0

ios - 无法将 Flutter iOS 应用程序验证到 AppStore