首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数码相机算法

数码相机算法
EN

Stack Overflow用户
提问于 2011-05-09 17:07:15
回答 3查看 6.7K关注 0票数 24

我正在开发一个简单的视频设备,我想介绍一些标准的酷相机功能。我想向大家介绍

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

现在我正在寻找一些例子,如何实现这些特性。你有什么有用的链接吗?

编辑:好的,我将使用标准的CCD相机,它可以为我提供~1 1MPix分辨率的20 use。我计划用C#编写它,如果出现性能问题,我将使用C++。我要镜头+ CCD相机+马达。

编辑:我想看一些更详细的算法描述。我确信有些课程必须在大学课程中教授,但我很难找到一些。对于焦点指示器,我尝试过一种原始的方法,但在某些情况下失败了。

代码语言:javascript
复制
 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;

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-17 22:51:31

只是为了通知你。我正在WPF中开发一个专业的500万像素数码相机软件。在DotNet而不是C++。有一些线程问题需要知道,但它工作得非常快。更多的性能,因为GPU是使用。

曾傑瑞的回答做得很好。聚焦检测是“基于时间/帧的对比度检测”。逻辑是简单的,保持它的表现力并不容易。自动对焦检测

要检查曝光时间,如果您已经创建了图像的直方图,这是很容易的。图像直方图在任何情况下,您都需要这样做

  • 红通道
  • 绿色通道
  • 蓝色通道
  • 增益
  • 曝光时间

这种混合使它变得更加复杂,因为你也可以使用颜色增益通道来增加图像的亮度。RGB图像数字。亮度可以有与“增益”和“曝光”时间相同的结果。

如果您自动计算曝光时间,请记住,您需要一个框架来计算它和曝光时间越短,您将得到更多的框架。这意味着,如果你想有一个好的算法,总是尝试有一个很短的曝光时间,并慢慢增加它的。不要使用线性算法,这样可以缓慢地降低值。

也有更多的方法为数码相机,如像素宾宁像素Binning,以增加框架,以获得快速聚焦的结果。

以下是焦点如何生成聚焦强度图像的示例:

代码语言:javascript
复制
 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
票数 6
EN

Stack Overflow用户

发布于 2011-05-09 18:07:04

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

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

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

对比度检测自动对焦确实会使焦距显示有点困难--特别是,在对比度再次下降之前,你永远不知道什么时候达到了最大对比度。当你在做自动对焦时,你会集中注意力,直到你看到一个峰值,然后再看到它开始下降,然后开车回到最高的地方。对于手动聚焦指示器,您无法识别最大对比度,直到它开始再次下降。用户必须遵循大致相同的模式,通过最佳焦点,然后回到最佳状态。

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

票数 14
EN

Stack Overflow用户

发布于 2011-05-17 12:20:44

AForge.net具有用于图像处理的很多东西,包括边缘检测和卷积滤波器。另一个(更大的)库是OpenCV,但只有.net的包装器,AForge是直接用c#编写的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5940158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档