在开发生物识别注册软件时,需要捕获符合ICAO标准的面部图像用于国家文件。在评估了不同的方法后,选择了一个免费且易于使用的方法。本文将展示如何轻松地连接到网络摄像头,并在其上显示一些用户生成的内容。这种方法可能对增强现实应用非常有用。
在为生物识别注册软件工作时,需要使用网络摄像头作为图像源。经过评估不同的方法后,选择了一个免费且易于使用的方法。
已经发布了一个Visual Studio 2012项目的源代码。示例中使用的语言是VB.NET,相信它易于理解,并且可以轻松地移植到任何其他.NET语言。
可以访问AForge网站下载当前版本的组件,并将以下程序集包含到项目中:
最简单的方法是使用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