数码相机算法

时间:2011-05-09 17:07:16

标签: c# algorithm image-processing camera

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

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

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

编辑: 好的,我会使用标准的CCD相机,它可以在~1MPix分辨率下提供~20fps。我打算用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;

由于

3 个答案:

答案 0 :(得分:14)

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

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

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

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

或者,您可以使用相位检测。这使用通过两个棱镜的“图片”对齐,就像在自动对焦开始使用之前在许多(大多数?)单反相机中使用的分割图像取景器一样。

答案 1 :(得分:6)

告诉你。我正在使用 WPF 中的专业法医500万像素数码相机软件。在 DotNet 而非C ++中。有一些线程问题需要知道,但它的工作速度非常快。性能更高,因为使用了GPU。

杰瑞在答案上做得很好。 焦点检测是“基于时间/帧的对比度检测”。逻辑很简单,为了保持高效,这并不容易。 Auto Focus detection

要检查曝光时间,可以轻松创建图像的直方图。 Image histogram 无论如何,你需要为

做这件事
  • 红色频道
  • 绿色频道
  • 蓝色频道
  • 增益
  • 曝光时间

这种混合使它更复杂,因为你也可以使用色彩增益通道来增加图像的亮度。 RGB image digital。亮度可以与“增益”和“曝光”时间相同。

如果您自动计算曝光时间,请记住您需要一个框架来计算它,并且曝光时间越小,您将获得更多的帧。这意味着,如果你想拥有一个好的算法,总是试着让非常小的曝光时间慢慢增加。不要使用线性算法,慢慢减小值。

还有更多像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 :(得分:1)

AForge.netalot of stuff进行图像处理,包括边缘检测和卷积滤镜。您可能想要查看的另一个(更大)库是OpenCV,但只有.net的包装器,其中AForge直接用c#编写