Просто чтобы сообщить вам. Я работаю над профессиональным 5-мегапиксельным программным обеспечением для судебно-медицинской экспертизы в WPF . В DotNet не C ++. Есть кое-что, что нужно знать, но работает он очень быстро. Более производительный, потому что используется графический процессор.
Джерри хорошо поработал со своим ответом.
Обнаружение фокуса - это «Обнаружение контрастности по времени / кадрам». Логика проста, поддерживать ее работоспособность непросто.
Обнаружение автофокуса
Чтобы проверить время экспозиции, легко, если вы создали гистограмму изображения. Гистограмма изображения
В любом случае вам нужно сделать это за
- Красный канал
- Зеленый канал
- синий канал
- Усиление
- Время выдержки
Этот микс делает его немного более сложным, поскольку вы также можете использовать каналы усиления цвета для увеличения яркости изображения. RGB изображение цифровое . Яркость может иметь такой же результат, как со временем «Усиление» и «Выдержка».
Если вы рассчитываете время экспозиции автоматически, имейте в виду, что вам необходим кадр для его расчета, и как можно меньше время экспозиции, чем больше кадров вы получите. Это означает, что если вы хотите иметь хороший алгоритм, всегда старайтесь иметь очень маленькое время экспозиции и медленно увеличивайте его . Не используйте линейный алгоритм, где вы медленно уменьшаете значение.
Существует также больше методов для цифровых камер, таких как 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