簡體   English   中英

數碼相機算法

[英]Digital camera algorithms

我正在研究一個簡單的視頻設備,我想介紹一些標准的酷相機功能。 其中我想介紹一下

  • 重點指標
  • 自動對焦
  • 自動曝光(理想曝光時間估算)

現在我正在尋找一些例子,如何實現這些功能。 你有任何有用的鏈接嗎?

編輯:好的,我將使用標准的CCD相機,它可以提供約20fps的~1MPix分辨率。 我打算用C#編寫它,如果出現性能問題,我會使用C ++。 我將有鏡頭+ 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;

謝謝

從結束開始,可以這么說:

自動曝光非常簡單:測量光線水平並計算出平均光線需要多長時間才能產生~15-18%的灰度級。 有很多嘗試要改進它(通常通過分別計量圖片的多個部分,並處理這些結果),但這是起點。

有兩種不同類型的自動對焦。 大多數攝像機使用基於檢測對比度的攝像機 - 查看傳感器的輸入,當相鄰像素之間的差異最大化時,您認為“焦點對准”。

對比度檢測自動對焦確實使焦點指示變得有點困難 - 特別是,在對比度再次開始下降之前,您永遠不知道何時達到最大對比度。 當你進行自動對焦時,你會集中注意力直到看到一個峰值,然后看到它再次開始下降,然后將其驅回到最高點。 對於帶指示燈的手動對焦,在再次開始下降之前,無法識別最大對比度。 用戶必須遵循大致相同的模式,移動經過最佳焦點,然后回到最佳狀態。

或者,您可以使用相位檢測。 這使用來自兩個棱鏡的“圖片”的對齊,非常類似於在自動對焦開始使用之前在許多(大多數?)SLR中使用的分割圖像取景器。

只是告訴你。 我正在WPF中使用專業的法醫500萬像素數碼相機軟件。 DotNet而不是C ++中。 有一些線程問題需要知道,但它的工作速度非常快。 性能更高,因為使用了GPU。

傑里的回答做得很好。 焦點檢測是“基於時間/幀的對比度檢測”。 邏輯很簡單,為了保持高效,這並不容易。 自動對焦檢測

要檢查曝光時間,可以輕松創建圖像直方圖。 圖像直方圖在任何情況下你都需要這樣做

  • 紅色通道
  • 綠色通道
  • 藍色通道
  • 獲得
  • 曝光時間

這種混合使它更復雜,因為您還可以使用顏色增益通道來增加圖像的亮度。 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

AForge.net很多用於圖像處理的東西 ,包括邊緣檢測和卷積濾波器。 您可能想要查看的另一個(更大的)庫是OpenCV,但只有.net的包裝器,其中AForge直接用c#編寫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM