Алгоритмы цифровой камеры - PullRequest
24 голосов
/ 09 мая 2011

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, я буду использовать стандартную камеру CCD, которая может дать мне ~ 20 кадров в секунду в разрешении ~ 1MPix.Я планирую написать это на C #, в случае проблем с производительностью я буду использовать C ++.У меня будет объектив + ПЗС-камера + мотор.

РЕДАКТИРОВАТЬ: Я хотел бы увидеть более подробное описание алгоритма.Я уверен, что некоторые должны преподаваться на университетских курсах, но у меня есть проблемы с поиском некоторых.Для индикатора фокуса я пробовал примитивный подход, но в некоторых случаях он не удался.

 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;

Спасибо

Ответы [ 3 ]

14 голосов
/ 09 мая 2011

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

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

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

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

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

6 голосов
/ 18 мая 2011

Просто чтобы сообщить вам. Я работаю над профессиональным 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
1 голос
/ 17 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...