Плавная фокусировка на AVCaptureDevice - PullRequest
0 голосов
/ 15 мая 2019

Я использую AVCaptureDevice setFocusModeLocked для реализации линейного изменения фокуса от точки А к точке Б. Для этого я определяю дельту как нечто вроде 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 Ответ

1 голос
/ 04 июня 2019

Есть несколько способов.

(1) уменьшить временной интервал для повторного вызова функции. Только медленный вызов создаст визуально заметный эффект, если он достаточно быстрый, человек не может заметить, например, ваш свет мигает с частотой 50 Гц, и вы думаете, что он постоянно включен

(2) уменьшить дельту до меньшего значения. так что даже если время между ними велико, но каждый раз меняются очень мало. поэтому глаз также не может заметить

(3) использовать другую функцию нелинейного отображения, такую ​​как функция exp или log. Вместо вызова линейного добавлена ​​рампа. другой exp или log может быть лучше, так как от A до B обычно не отображается линейно. в визуально не очень чувствительной области двигайтесь быстрее, в визуально чувствительной области двигайтесь медленнее. Эмм, как мне описать это? Самое близкое, что я могу придумать для иллюстрации, это стереозрение. на более близком расстоянии у вас есть более дискретный уровень для представления. и на дальнем расстоянии, есть меньший дискретный уровень представления. те же яблоки для фокуса.

ezist способ испытать это - запустить v4l2ucp с chesse в Ubuntu. перетащите фокус с одной стороны на другую. Вы заметите, что на близком расстоянии оно сильно меняется, в середине - далеко, изменение очень минимальное

...