使用AForge库实现摄像头视频流与内容叠加

在开发生物识别注册软件时,需要捕获符合ICAO标准的面部图像用于国家文件。在评估了不同的方法后,选择了一个免费且易于使用的方法。本文将展示如何轻松地连接到网络摄像头,并在其上显示一些用户生成的内容。这种方法可能对增强现实应用非常有用。

在为生物识别注册软件工作时,需要使用网络摄像头作为图像源。经过评估不同的方法后,选择了一个免费且易于使用的方法。

使用代码

已经发布了一个Visual Studio 2012项目的源代码。示例中使用的语言是VB.NET,相信它易于理解,并且可以轻松地移植到任何其他.NET语言。

可以访问AForge网站下载当前版本的组件,并将以下程序集包含到项目中:

  • AForge.dll(核心)
  • AForge.Math.dll
  • AForge.Imaging.dll
  • AForge.Video.dll
  • AForge.Video.DirectShow
  • AForge.Controls

最简单的方法是使用NuGet管理器(Visual Studio > 工具 > 库包管理器 > 管理解决方案的NuGet包),如下图所示。

在引用了AForge库之后,需要枚举视频源(列出可用的网络摄像头)及其视频模式(分辨率)。

以下是VB.NET代码示例:

Private Sub EnumerateVideoDevices() ' 枚举视频设备 Dim videoDevices As New FilterInfoCollection(FilterCategory.VideoInputDevice) If videoDevices.Count <> 0 Then ' 将所有设备添加到组合框 For Each device As FilterInfo In videoDevices ComboBoxSources.Items.Add(device.Name) Next Else ComboBoxSources.Items.Add("未找到DirectShow设备") End If ComboBoxSources.SelectedIndex = 0 End Sub Private Sub EnumerateVideoModes(device As VideoCaptureDevice) ' 获取选定视频源的分辨率 Me.Cursor = Cursors.WaitCursor ComboBoxModes.Items.Clear() Try Dim videoCapabilities As VideoCapabilities() = device.VideoCapabilities For Each capability As VideoCapabilities In videoCapabilities If Not ComboBoxModes.Items.Contains(capability.FrameSize) Then ComboBoxModes.Items.Add(capability.FrameSize) End If Next If videoCapabilities.Length = 0 Then ComboBoxModes.Items.Add("不支持") End If Finally Me.Cursor = Cursors.Default End Try End Sub

EnumerateVideoDevices方法将检查计算机上所有可用的DirectShow设备,并将它们枚举到videoDevices变量中。在用户选择了设备后,需要提供用户选择相机分辨率和相机提供新帧的速度的选项。枚举模式以选择相机时,使用EnumerateVideoModes函数。由于这个过程可能需要一些时间,建议更改默认光标或更好的是使用async或BackgroundWorker来完成这项工作。

使用AForge.Controls程序集向工具箱添加新控件。添加的工具之一叫做VideoSourcePlayer,它用于显示来自相机的实时视频。下面的代码片段显示了如何开始和结束向此控件显示实时视频流

Private Sub CameraStart() If Not videoDevice Is Nothing Then If Not (videoCapabilities Is Nothing) AndAlso (videoCapabilities.Length <> 0) Then videoDevice.DesiredFrameSize = DirectCast(ComboBoxModes.SelectedItem, Size) End If VideoSourcePlayer1.VideoSource = videoDevice VideoSourcePlayer1.Start() End If End Sub Private Sub CameraStop() If Not VideoSourcePlayer1.VideoSource Is Nothing Then ' 停止视频设备 VideoSourcePlayer1.SignalToStop() VideoSourcePlayer1.WaitForStop() VideoSourcePlayer1.VideoSource = Nothing End If End Sub

CameraStart方法将选定的视频源和视频模式分配给Aforge的控件VideoSourcePlayer。调用.Start方法后,视频将显示在此组件上。要停止显示视频,需要向VideoSourcePlayer控件发出停止显示来自相机源的视频的信号。请注意,视频线程与用户界面的线程不同。

通过向视频中添加自己的内容来与视频交互是有用的。下面的示例显示了如何向视频中添加自定义字符串。

Private Sub VideoSourcePlayer1_NewFrame(sender As Object, ByRef image As Bitmap) ' 添加叠加层 Dim g As Graphics = Graphics.FromImage(image) g.DrawString("增强现实?", New Font("Arial", 16), Brushes.Black, New Rectangle(10, 10, 200, 50)) g.Dispose() End Sub
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485