百度ai人脸识别项目C#

一、项目描述

本项目通过集成百度AI人脸识别API,实现了人脸检测和识别功能。用户可以上传图片,系统将自动识别人脸并返回识别结果。

二、开发环境

  • Visual Studio 2019或更高版本
  • .NET Framework 4.7.2或更高版本
  • AForge.NET库
  • 百度AI平台人脸识别API

三、具体实现

1.界面设计

1.1所用的库

  1. AForge.Controls
    • VideoSourcePlayer
  2. AForge.Video
    • VideoCaptureDevice
  3. AForge.Video.DirectShow
    • FilterInfoCollection
    • FilterInfo
  4. Baidu.Aip.Face
    • Face
  5. BaiduAI.Common
    • ClassLoger
    • JsonHelper
  6. Newtonsoft.Json.Linq
    • JArray
    • JObject
  7. System
    • 各种基本的系统功能和类型(如 Exception, EventArgs, 等等)
  8. System.Collections.Generic
    • Dictionary
  9. System.ComponentModel
    • BackgroundWorker 和其他组件模型支持
  10. System.Data
    • 数据处理
  11. System.Drawing
    • Image, Bitmap, Graphics, Pen, Point
  12. System.Drawing.Imaging
    • ImageFormat
  13. System.IO
    • 文件操作,如 File, FileStream, MemoryStream, Path, 等等
  14. System.Linq
    • LINQ 查询
  15. System.Security.Policy
    • 安全策略
  16. System.Text
    • StringBuilder
  17. System.Threading
    • Thread, ThreadPool, WaitCallback
  18. System.Windows.Forms
    • 各种 WinForms 控件(如 Form, Button, TextBox, OpenFileDialog, MessageBox, ComboBox, 等等)
  19. System.Windows.Interop
    • Imaging
  20. System.Windows.Media.Imaging
    • BitmapSource, BitmapFrame, BitmapSizeOptions, JpegBitmapEncoder, PngBitmapEncoder

1.2所用到的控件

  1. Form1
    • WinForms 窗体类
  2. Button
    • button1, button2, button3, button4, button5, button6, button7, button8, button9
  3. TextBox
    • textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7
  4. ComboBox
    • comboBox1
  5. OpenFileDialog
    • 文件打开对话框
  6. MessageBox
    • 信息框
  7. VideoSourcePlayer
    • 来自 AForge.Controls,用于视频显示
  8. WindowsMediaPlayer
    • axWindowsMediaPlayer1,用于播放音频(使用 AxWindowsMediaPlayer 控件)

1.3最终设计界面显示如下:

2.代码实现

2.0初始化

首先要在百度AI官网注册账号然后再人脸识别项目中申请创建应用,就可以获得自己的APP_ID,API_KEY,SECRET_KEY。

using AForge.Controls;
using AForge.Video;
using AForge.Video.DirectShow;
using Baidu.Aip.Face;
using BaiduAI.Common;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BaiduAI
{
    public partial class Form1 : Form
    {
        
        private readonly string APP_ID = "8xxx0583";
        private readonly string API_KEY = "Chxxxx3evL5rPW3skOL";
        private readonly string SECRET_KEY = "VT2FxxxxqEH1ZYcJSw";
        private Face client = null;
        private bool IsStart = false;
        private FaceLocation location = null;
        private FilterInfoCollection videoDevices = null;
        private VideoCaptureDevice videoSource;

        public Form1()
        {
            InitializeComponent();
            axWindowsMediaPlayer1.uiMode = "Invisible";
            client = new Face(API_KEY, SECRET_KEY);
        }
    }
}

2.1人脸检测

1.下面的自己的图片文件路径替换进去的话,使用应用的时候点击按钮就会先进入这个文件夹里面找图片,如果不更改的话,系统找不到文件路径,可能会按默认的进去。

2.设置参数这里,可以去官网的人脸识别技术文档里面查看具体有哪些token可以设置,也有一些参数有默认值。

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog dialog = new OpenFileDialog();
    dialog.InitialDirectory = "C:\\";//自己的图片文件路径
    dialog.Filter = "所有文件|*.*";
    dialog.RestoreDirectory = true;
    dialog.FilterIndex = 1;

    if (dialog.ShowDialog() == DialogResult.OK)
    {
        string filename = dialog.FileName;
        try
        {
            Image im = Image.FromFile(filename);
            var image = ConvertImageToBase64(im);
            string imageType = "BASE64";

            var options = new Dictionary<string, object>{
                {"max_face_num", 2},
                {"face_field", "age,beauty"},
                {"face_fields", "age,qualities,beauty"}
            };

            var result = client.Detect(image, imageType, options);
            textBox1.Text = result.ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

public string ConvertImageToBase64(Image file)
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        file.Save(memoryStream, file.RawFormat);
        byte[] imageBytes = memoryStream.ToArray();
        return Convert.ToBase64String(imageBytes);
    }
}

2.2人脸对比

通过选择两张图片,调用百度AI的人脸比对接口,比较两张图片中的人脸。

private void button2_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(textBox2.Text) || string.IsNullOrEmpty(textBox3.Text))
    {
        MessageBox.Show("请选择要对比的人脸图片");
        return;
    }
    try
    {
        string path1 = textBox2.Text;
        string path2 = textBox3.Text;

        var faces = new JArray
        {
            new JObject
            {
                {"image", ReadImg(path1)},
                {"image_type", "BASE64"},
                {"face_type", "LIVE"},
                {"quality_control", "LOW"},
                {"liveness_control", "NONE"},
            },
            new JObject
            {
                {"image", ReadImg(path2)},
                {"image_type", "BASE64"},
                {"face_type", "LIVE"},
                {"quality_control", "LOW"},
                {"liveness_control", "NONE"},
            }
         };

        var result = client.Match(faces);
        textBox1.Text = result.ToString();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

public string ReadImg(string img)
{
    return Convert.ToBase64String(File.ReadAllBytes(img));
}

2.3获取系统摄像头

通过AForge库获取摄像头设备,并显示实时视频。

private void Form1_Load(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;
    }

    videoSourcePlayer1.NewFrame += VideoSourcePlayer1_NewFrame;
    ThreadPool.QueueUserWorkItem(new WaitCallback(p =>
    {
        while (true)
        {
            IsStart = true;
            Thread.Sleep(500);
        }
    }));
}

private void VideoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
{
    if (IsStart)
    {
        IsStart = false;
        ThreadPool.QueueUserWorkItem(new WaitCallback(this.Detect), image.Clone());
    }
    if (location != null)
    {
        try
        {
            Graphics g = Graphics.FromImage(image);
            g.DrawLine(new Pen(Color.Black), new Point(location.left, location.top), new Point(location.left + location.width, location.top));
            g.DrawLine(new Pen(Color.Black), new Point(location.left, location.top), new Point(location.left, location.top + location.height));
            g.DrawLine(new Pen(Color.Black), new Point(location.left, location.top + location.height), new Point(location.left + location.width, location.top + location.height));
            g.DrawLine(new Pen(Color.Black), new Point(location.left + location.width, location.top), new Point(location.left + location.width, location.top + location.height));
            g.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show("绘制方框出错:" + ex.Message);
        }
    }
}

2.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();
            }

            MessageBox.Show("拍照成功,请进行人脸注册!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("摄像头异常:" + ex.Message);
    }
}

三、结果

人脸检测:

人脸对比:

四、结语

通过以上步骤,我们成功实现了一个使用百度AI进行人脸识别的项目。该项目包括人脸检测、人脸比对、摄像头拍照、人脸注册和人脸登录等功能,展示了如何结合百度AI平台和AForge库实现实用的人脸识别应用。希望本博客能对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733352.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django 模版变量

1&#xff0c;模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格&#xff0c;模板变量名称&#xff0c;可以由数字&#xff0c;字母&#xff0c;下划线组成&#xff0c;不能包含空格模板变量还支持列表&#xff0c;字典&#xff0c;对象 2&#xff0c;…

一文搞懂Linux信号【下】

目录 &#x1f6a9;引言 &#x1f6a9;阻塞信号 &#x1f6a9;信号保存 &#x1f6a9;信号捕捉 &#x1f6a9;操作信号集 1.信号集操作函数 2.其它操作函数 &#x1f6a9;总结&#xff1a; &#x1f6a9;引言 在观看本博客之前&#xff0c;建议大家先看一文搞懂Linux信…

React hydrateRoot如何实现

React 服务器渲染中&#xff0c;hydrateRoot 是核心&#xff0c;它将服务器段的渲染与客户端的交互绑定在一起&#xff0c;我们知道 React 中 Fiber Tree 是渲染的的核心&#xff0c;那么 React 是怎么实现 hydrateRoot 的呢&#xff1f;首先我们验证一下&#xff0c;hydrateRo…

期货交易豆粕品种详细分析

文章目录 1、豆粕期货标准&#xff08;2024年6月22号数据&#xff09;2、豆粕是什么3、豆粕1、5、9合约区别4、影响豆粕的价格因素1、大豆的供应情况。2、豆粕的季节性3、油粕比&#xff08;豆油和豆粕的价格关系 &#xff09; 5、美国大豆的生产/库存炒作6、豆粕双方&#xff…

uniapp实现路由拦截——遇到问题(三)

uniapp路由拦截开发过程中遇到问题 文章目录 uniapp路由拦截开发过程中遇到问题App 无法退出应用监听返回数据结构解决方式模拟原生物理返回键提示不提示&#xff0c;直接退出应用 微信小程序 登录成功返回页面报错效果图不同平台来源页面数据结构解决方式 App 无法退出应用 安…

2005年上半年软件设计师【上午题】试题及答案

文章目录 2005年上半年软件设计师上午题--试题2005年上半年软件设计师上午题--答案2005年上半年软件设计师上午题–试题

C++/Qt 小知识记录7

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识7 编译FFMPEG遇到的问题CMakeLists.txt配置FFMPEG的依赖方式&#xff1a; x264在Windows下编译生成*.libVS编译Qt工程时&#xff0c;遇到提示Change Qt Version的情况在QtOsg的窗口上嵌入子窗口&…

面试官:请你实现三栏布局并且优先加载中间内容 我:稳啦- ̗̀(๑ᵔ⌔ᵔ๑)

前言 三栏布局是网页设计中一种经典布局方式&#xff0c;它将页面分为三个垂直部分&#xff1a;左栏、中栏和右栏&#xff0c;三栏在同一行显示。 这种布局模式在很多网站的首页或内容密集型页面中非常常见&#xff0c;因为它能够有效地组织信息&#xff0c;提供良好的用户体…

【产品应用】一体化步进伺服电机在吊装机器人中的应用

随着工业自动化和智能制造的发展&#xff0c;吊挂式智能巡检机器人逐渐成为许多工业场景中的重要角色。这类机器人不仅能够提升工作效率&#xff0c;减少人工干预&#xff0c;还能在复杂或危险环境中完成巡检任务。在这些机器人的设计与制造中&#xff0c;一体化步进伺服电机扮…

jrebel安装使用教程(2022.4.1版本)

本方法适用于jrebel2022.4.1版本&#xff0c;之后的版本不再适用。 1.下载插件 下载地址 2.安装插件 可以通过idea内部安装 也可以将插件解压进idea的安装目录下的plugins。 3.激活 Team URL中填入 https://jrebel.qekang.com/{guid}这里提供两个guid生成地址&#xf…

Redis学习|Redis基础知识、Redis五大数据类型、Redis三种特殊数据类型、Redis事务

Redis基础知识 redis默认有16个数据库&#xff0c;并且这个数量可以在conf配置文件中更改 默认使用的是第0个 可以使用 select 进行切换数据库! key *查看数据库所有的key 清除当前数据库 flushdb 清除全部数据库的内容FLUSHALL 为什么redis是6379!(了解一下即可!) Redis 是…

Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

文章目录 Elasticsearch聚合查询说明空值率查询DSL Elasticsearch聚合基础知识扩展Elasticsearch聚合概念Script 用法Elasticsearch聚合查询语法指标聚合&#xff08;Metric Aggregations&#xff09;桶聚合&#xff08;Bucket Aggregations&#xff09;矩阵聚合&#xff08;Ma…

福州大学 2022~2023 学年第 1 学期考试 A 卷压轴题参考答案

题目&#xff1a; 定义一个抽象类Structure&#xff08;含有纯虚函数type函数&#xff0c;用以显示当前结构的类型&#xff1b; 含有show函数&#xff09;&#xff0c; 在此基础上派生出Building类, 用来存储一座楼房的层数、房间数以及它的总平方米数。 建立派生 类House&am…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准&#xff0c;被广泛应用于各类电子产品中。作为Type-C连接器的制造商&#xff0c;对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求&#xff0c;Type-C连接…

链动2+1模式:解锁用户留存与复购的增长密码

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的软件开发公司&#xff0c;专注于为用户打造卓越的产品体验。今天&#xff0c;我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式&#xff0c;以及它是如何助力我们提升用户留存和复购率的。 尽管链…

跟TED演讲学英文:How language shapes the way we think by Lera Boroditsky

How language shapes the way we think Link: https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think? Speaker: Lera Boroditsky Date: November 2017 文章目录 How language shapes the way we thinkIntroductionVocabularySummaryTranscriptA…

6.25世界白癜风日·成都博润白癜风医院获评“成都市医学重点专科”

夏日热情如江潮&#xff0c;勇攀高峰正当时。为激发新质生产力&#xff0c;驱动学术研究引领医院发展&#xff0c;也为了迎接 6.25 世界白癜风日。 6月22日&#xff0c;成都博润白癜风医院隆重举行成都市医学重点专科授牌新闻发布会暨成都市市级继续医学教育项目《难治性白癜风…

PythonScrapy爬虫被ban的一些解决办法

大多数python写爬虫都是当做工具在用&#xff0c;爬虫过程中都会遇到命中反爬导致无法继续访问。访问出现500或者其他服务器禁止错误&#xff0c;像下面这样 在这之前&#xff0c;默认你已经了解python及scrapy。具体selenium的使用方法可以查阅官方文档。 我的处理办法&#x…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试&#xff0c;支持生成html格式的测试报告&#xff0c;如下图所示&#xff0c;使用"npx playwright test"执行测试&#xff0c;执行完成后&#xff0c;会提示“npx playwright show-report”命令。执行该命令&#…

Qt Object:智能即时聊天室项目

目录 1.项目介绍 2.设计思路 3.Pro文件配置 4.项目演示 5.项目开源 项目介绍 智能即时聊天室系统&#xff08;AIChatProject&#xff09;是一个高效、灵活的即时通讯解决方案。它融合了百度的开源大型语言模型——文心一言&#xff0c;通过API接口实现深度集成。系统专为聊天和…