数码相机算法

Big*_*les 24 c# algorithm camera image-processing

我正在研究一个简单的视频设备,我想介绍一些标准的酷相机功能.其中我想介绍一下

  • 重点指标
  • 自动对焦
  • 自动曝光(理想曝光时间估算)

现在我正在寻找一些例子,如何实现这些功能.你有任何有用的链接吗?

编辑:好的,我将使用标准的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;
Run Code Online (Sandbox Code Playgroud)

谢谢

Jer*_*fin 14

从结束开始,可以这么说:

自动曝光非常简单:测量光线水平并计算出平均光线需要多长时间才能产生~15-18%的灰度级.有很多尝试要改进它(通常通过分别计量图片的多个部分,并处理这些结果),但这是起点.

有两种不同类型的自动对焦.大多数摄像机使用基于检测对比度的摄像机 - 查看传感器的输入,当相邻像素之间的差异最大化时,您认为"焦点".

对比度检测自动对焦确实使焦点指示变得有点困难 - 特别是,在对比度再次开始下降之前,您永远不知道何时达到最大对比度.当你进行自动对焦时,你会集中注意力直到看到一个峰值,然后看到它再次开始下降,然后将其驱回到最高点.对于带指示灯的手动对焦,在再次开始下降之前,无法识别最大对比度.用户必须遵循大致相同的模式,移动经过最佳焦点,然后回到最佳状态.

或者,您可以使用相位检测.这使用来自两个棱镜的"图片"的对齐,非常类似于在自动对焦开始使用之前在许多(大多数?)SLR中使用的分割图像取景器.


gol*_*gel 6

只是告诉你.我正在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
Run Code Online (Sandbox Code Playgroud)