Ответ 1
Просто чтобы сообщить вам. Я работаю над профессиональным криминалистическим 5-мегапиксельным программным обеспечением для цифровых камер в WPF. В DotNet не С++. Есть некоторые threading issus, чтобы знать, но он работает совершенно быстро. Более эффективен, поскольку используется графический процессор.
Джерри отлично справился со своим ответом. Обнаружение фокуса - это "Контрастное обнаружение на основе времени/кадров". Логика проста, чтобы сохранить ее работоспособность, это непросто. Обнаружение автофокусаЧтобы проверить время экспозиции, легко создать гистограмму изображения. Гистограмма изображений В любом случае вам нужно сделать это для
- Красный канал
- Зеленый канал
- Голубой канал
- Усиление
- Время экспозиции
Этот микшер делает его немного более сложным, потому что вы также можете использовать каналы усиления цвета для увеличения яркости изображения. цифровое изображение RGB. Яркость может иметь тот же результат, что и при "Gain" и "Exposure".
Если вы вычисляете время экспозиции автоматически, помните, что вам нужен кадр, чтобы рассчитать его, и меньше времени экспозиции, чем больше кадров, которые вы получите. Это означает, что если вы хотите иметь хороший алгоритм, всегда старайтесь иметь очень маленькое время экспозиции и медленно увеличивайте его. Не используйте линейный алгоритм, в котором вы медленно уменьшаете значение.
Есть также больше методов для цифровых камер, таких как Pixel Binning Pixel Binning, чтобы увеличить частоту кадров, чтобы получить быстрые результаты фокусировки.
Вот пример того, как фокус может работать для создания изображения интенсивности фокусировки:
Private Sub GetFocusValue(ByRef C1 As Color, ByVal LCol1 As List(Of Color), ByVal LCol2 As List(Of Color), ByVal AmplifierPercent As Single)
Dim MaxDiff1 As Integer = 0
Dim MaxDiff2 As Integer = 0
Dim Factor As Single = 0
Dim D As Integer
Dim LR1 As New List(Of Integer)
Dim LR2 As New List(Of Integer)
Dim LG1 As New List(Of Integer)
Dim LG2 As New List(Of Integer)
Dim LB1 As New List(Of Integer)
Dim LB2 As New List(Of Integer)
For Each C As Color In LCol1
LR1.Add(C.R)
LG1.Add(C.G)
LB1.Add(C.B)
Next
For Each C As Color In LCol2
LR2.Add(C.R)
LG2.Add(C.G)
LB2.Add(C.B)
Next
MaxDiff1 = Me.GetMaxDiff(LR1)
MaxDiff1 = Math.Max(MaxDiff1, Me.GetMaxDiff(LG1))
MaxDiff1 = Math.Max(MaxDiff1, Me.GetMaxDiff(LB1))
MaxDiff2 = Me.GetMaxDiff(LR2)
MaxDiff2 = Math.Max(MaxDiff2, Me.GetMaxDiff(LG2))
MaxDiff2 = Math.Max(MaxDiff2, Me.GetMaxDiff(LB2))
If MaxDiff1 > MaxDiff2 Then
D = MaxDiff1 - MaxDiff2
Factor = D / 255
Factor = Factor / (AmplifierPercent / 100)
Factor = Math.Min(Factor, 1)
Factor = 1 - Factor 'invert result
'TB.Math.Swap(MaxDiff1, MaxDiff2)
'Factor = 255 'the original BM1 is better
Else
D = MaxDiff2 - MaxDiff1
Factor = D / 255
Factor = Factor * (AmplifierPercent / 100)
Factor = Math.Min(Factor, 1)
'Factor = 0 'the BM2 is better
End If
Factor = Factor * 255
C1 = Color.FromArgb(Convert.ToByte(Factor), C1.R, C1.G, C1.B)
End Sub