Подтвердить что ты не робот

Алгоритмы цифровой камеры

Я работаю над простым видеоустройством, и я хотел бы представить некоторые стандартные классные функции камеры. Среди всего, что я хотел бы представить

  • Индикатор фокусировки
  • Автофокусировка
  • Автоматическая экспозиция (идеальная оценка времени экспозиции)

Сейчас я ищу несколько примеров, как эти функции могут быть реализованы. У вас есть полезные ссылки?

ИЗМЕНИТЬ: Хорошо, я буду использовать стандартную CCD-камеру, которая может обеспечить мне ~ 20 кадров в секунду в разрешении ~ 1MPix. Я планирую написать его на С#, в случае проблем с производительностью, я буду использовать С++. У меня будет объектив + CCD-камера + двигатель.

ИЗМЕНИТЬ: Я хотел бы увидеть более подробное описание алгоритма. Я уверен, что некоторых из них нужно преподавать в университетских курсах, но у меня есть проблемы с поиском некоторых. Для индикатора фокусировки я пробовал примитивный подход, но в некоторых случаях он не удался.

 int verticalPoints = 0, horizontalPoints = 0;
 ///Calculate the vertical differences
 for (int x = 0; x < toAnalyze.Width; x++)
 {
     for (int y = 1; y < toAnalyze.Height; y++)
     {
        byte* pixel = (byte*)data.Scan0 + y * stride + x;
        verticalDiff += Math.Abs(*pixel - *(pixel - stride));;
     }         
  }
  verticalDiff /= toAnalyze.Width * (toAnalyze.Height-1);
  ///Calculate horizontal differences
  for (int y = 0; y < toAnalyze.Height; y++)
  {
     for (int x = 1; x < toAnalyze.Width; x++)
     {
        byte* pixel = (byte*)data.Scan0 + y * stride + x;
        horizontalDiff += Math.Abs(*pixel - *(pixel - 1));
     }
   }
   horizontalDiff /= (toAnalyze.Width-1) * toAnalyze.Height;
   ///And return the average value
   return(verticalDiff + horizontalDiff) / 2;

Спасибо

4b9b3361

Ответ 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

Ответ 2

Начиная с конца, так сказать:

Автоэкспозиция довольно проста: измерьте уровень освещенности и выясните, сколько времени требуется для этого среднего света, чтобы получить уровень серого на 15-18%. Есть много попыток улучшить это (обычно путем измерения нескольких разделов изображения отдельно и обработки этих результатов), но это отправная точка.

Существует два отдельных типа автофокуса. Большинство видеокамер используют один, основанный на обнаружении контраста, - посмотрите на вход от датчика, и когда различия между соседними пикселями будут максимальными, вы считаете, что "в фокусе".

Автофокусировка на контрастность делает довольно сложным сделать индикацию фокусировки, хотя, в частности, вы никогда не знаете, когда достигли максимального контраста, пока контраст не начнет падать снова. Когда вы делаете автофокус, вы фокусируетесь, пока не увидите пик, а затем увидите, как он снова начнет падать, а затем верните его туда, где он был самым высоким. Для ручной фокусировки с индикатором вы не можете распознать максимальный контраст, пока он снова не начнет падать. Пользователь должен будет следовать примерно по той же схеме, пройдя лучший фокус, а затем вернуться к оптимальному.

В качестве альтернативы вы можете использовать обнаружение фазы. Это использует выравнивание "изображений", проходящих через две призмы, подобно видоискателям с раздельным изображением, которые использовались во многих зеркалах (большинство?) Перед использованием автофокуса.

Ответ 3

AForge.net много вещей для обработка изображений, включая фильтры обнаружения краев и свертки. Другая (большая) библиотека, которую вы можете посмотреть, - OpenCV, но имеет только оболочки для .net, где, когда AForge написан на С# напрямую