一、 准备工作
1、百度AI注册
(1)打开百度智能云网址:百度智能云-云智一体深入产业,注册登录,进入如下界面。
(2)点击立即使用。
(3)点击创建应用
执行完后续创建步骤后会得到自己的 API key和Secret key
(4)后续c#SDK的配置,看官方文档即可
2、Nuget包下载
AForge包用于对视频输入设备的调用和处理。
Baidu.AI包用于调用百度ai。
二、代码实现
1、页面设计
2、核心功能实现
(1)文件类型转换
该方法用于将 Image
对象转换为 Base64 字符串,以便后续上传或处理。
public string ConvertImageToBase64(Image file)
{
using (MemoryStream memoryStream = new MemoryStream())
{
file.Save(memoryStream, file.RawFormat);
byte[] imageBytes = memoryStream.ToArray();
return Convert.ToBase64String(imageBytes);
}
}
首先通过调用Save函数将Image对象保存到内存流中,保存的格式是Image对象的原始格式,然后将内存流转换为字节数组,最后将字节数组转换为Base64字符串。
将 BitmapSource
对象转换为字节数组的方法:
public byte[] BitmapSource2Byte(BitmapSource source)
{
try
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 100;
using (MemoryStream stream = new MemoryStream())
{
encoder.Frames.Add(BitmapFrame.Create(source));
encoder.Save(stream);
byte[] bit = stream.ToArray();
stream.Close();
return bit;
}
}
catch (Exception ex)
{
ClassLoger.Error("BitmapSource2Byte", ex);
}
return null;
}
设置 JPEG 编码器的质量QualityLevel等级为 100,表示最高质量,后创建一个 BitmapFrame,并添加到编码器的帧集合中,将编码器内容保存到内存流中,再将内存流转换为字节数组。
(2)搜寻可用摄像头设备
该方法用于获取并显示电脑上已安装的视频设备。
private void button6_Click(object sender, EventArgs e)
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices != null && videoDevices.Count > 0)
{
foreach (FilterInfo device in videoDevices)
{
comboBox1.Items.Add(device.Name);
}
comboBox1.SelectedIndex = 0;
}
}
调用获取所有视频输入设备(如摄像头)的集合FilterCategory.VideoInputDevice,检查是否有可用的视频设备, 遍历所有视频设备,并 将每个视频设备的名称添加到 comboBox1 控件中,最后设置默认选择第一个视频设备 。
(3)开启摄像头
该方法用于连接并启动所选的视频设备。
private void CameraConn()
{
if (comboBox1.Items.Count <= 0)
{
MessageBox.Show("请插入视频设备");
return;
}
videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);
videoSource.DesiredFrameRate = 1;
videoSourcePlayer1.VideoSource = videoSource;
videoSourcePlayer1.Start();
}
首先检查 comboBox1 中是否有可用的视频设备,如果没有可用的视频设备,显示消息提示用户插入视频设备。若有,则 获取用户在 comboBox1 中选择的视频设备,并设置视频源的期望帧大小为 320x240、视频源的期望帧率为每秒 1 帧,将视频源分配给 videoSourcePlayer1 控件后,启动视频源播放 。
(4)摄像头拍照
该方法用于从摄像头捕获当前帧,并将其保存为图片文件
private void button5_Click(object sender, EventArgs e)
{
if (comboBox1.Items.Count <= 0)
{
MessageBox.Show("请插入视频设备");
return;
}
try
{
if (videoSourcePlayer1.IsRunning)
{
BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
videoSourcePlayer1.GetCurrentVideoFrame().GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
PngBitmapEncoder pE = new PngBitmapEncoder();
pE.Frames.Add(BitmapFrame.Create(bitmapSource));
string picName = GetImagePath() + "\\" + DateTime.Now.ToFileTime() + ".jpg";
if (File.Exists(picName))
{
File.Delete(picName);
}
using (Stream stream = File.Create(picName))
{
pE.Save(stream);
}
if (videoSourcePlayer1 != null && videoSourcePlayer1.IsRunning)
{
videoSourcePlayer1.SignalToStop();
videoSourcePlayer1.WaitForStop();
}
this.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("摄像头异常:" + ex.Message);
}
}
首先检查 comboBox1 中是否有可用的视频设备, 如果没有可用的视频设备,显示消息提示用户插入视频设备。若有,则检查视频播放器是否正在运行,若运行则获取当前视频帧,并将其转换为 BitmapSource 对象,再将视频帧添加到编码器的帧集合中,并生成保存图片的路径和文件名,如果文件已存在,删除它,然后创建文件流,将编码器的内容保存到文件中,在拍照完成后关闭摄像头并刷新,同时关闭窗体。
三、效果展示
1、人脸登录
使用摄像头获取当前帧,然后与百度AI库中的所有人脸进行比对,如果相似度高于某个阈值则返回该人脸的用户名,并提示登录成功。
2、人脸对比
选择两张图片路径后,点击图片识别按钮,可得到匹配相似度。例如,识别结果为91%。
3、人脸识别
选择图片路径后,点击人脸识别按钮会返回人脸识别信息,展示具体的人脸特征和匹配度。
四、总结
通过上述代码和步骤,可以轻松实现从摄像头捕捉视频帧并进行人脸识别的功能。利用百度AI的强大能力,能够快速构建各种人脸识别应用,提高系统的智能化水平。希望这些内容能为大家提供有价值的参考,欢迎大家在CSDN上分享和交流更多的技术经验。