调用百度AI,实现人脸识别、人脸登录、人脸对比--基于WinForm开发

一、 准备工作

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上分享和交流更多的技术经验。

 

  • 27
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"C"在计算机科学和编程中是一个非常重要的字符和符号。 首先,它是一种编程语言,即C语言。C语言是一种通用的高级编程语言,广泛用于开发计算机软件和应用程序。C语言具有简洁、高效的特点,允许程序员控制硬件和内存,并具有广泛的应用领域,包括操作系统、嵌入式系统和游戏开发等。 此外,"C"还代表了编程中的条件语句。在大多数编程语言中,条件语句用于根据给定条件执行不同的代码块。条件语句通常使用if、else和else if关键字来实现。通过使用条件语句,程序员可以根据不同的情况选择性地执行不同的代码,从而实现更灵活和智能的程序逻辑。 同时,“C”也是一种数据类型,即字符类型。在C语言中,字符类型用于表示单个字符,通常在单引号中表示。字符类型可以用于存储字母、数字、符号或特殊字符等。在编程中,我们可以使用字符类型来处理文本数据,进行比较、替换或拼接等操作。 除了以上几个重要的含义,"C"还有其他用途,比如代表"Celsius"(摄氏度)单位,用于表示温度;代表汇编语言中的"Carry"(进位标志),用于处理二进制数据的进位运算;还可以代表一些专业术语,如"Cascade"(级联)和"Closure"(闭包)等。 总之,"C"作为一个字符和符号,在计算机科学和编程中有着重要的意义,涵盖了编程语言、条件语句、字符类型以及其他一些用途。它是我们深入学习和理解计算机科学和编程的基石之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值