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

一、注册百度AI,领取免费权限

(1) 打开百度智能云网址:https://cloud.baidu.com/,注册登录,进入如下界面。

在这里插入图片描述

(2) 点击立即使用。

在这里插入图片描述

(3) 点击创建应用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4) 在应用名称一栏输入所建应用的名称,在应用描述一栏输入对所创建应用的大概描述,然后点击立即创建。

在这里插入图片描述

(5)配置这个关于C#的SDK,看官方的文档即可

在这里插入图片描述
注意,要先配置好你的NuGet,要自己手动装一下下面这几个:
在这里插入图片描述

(6)接下来,往你的这个库里面添加人脸和用户

在这里插入图片描述

二、代码编写:

1.设计页面

先用winform随便搂一个页面先:
在这里插入图片描述

2. 前期配置

先把自己的API啥的导入进去,确保能够你的程序能够正常调用这些

private string APP_ID = "你的APP_ID";
private string API_KEY = "你的API_KEY";
private string SECRET_KEY = "你的SECRET_KEY";
private Face client = null;
private bool IsStart = false;
private FaceLocation location = null;
private FilterInfoCollection videoDevices = null;
private VideoCaptureDevice videoSource;

然后定义一些辅助的函数啥的
比如把图片转化成base64的:

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

读入图片:

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

连接打开摄像头:

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

2.人脸检测

这个代码的主要实现的功能是接受并处理图像数据,也就是将传入的图像转换为 Bitmap 格式,并进一步处理为百度人脸识别所需的 Base64 格式字符串。然后调用百度人脸检测API,并返回检测结果。最后是解析并显示人脸检测结果,提取出人脸的位置、年龄、模糊程度等信息,并在用户界面上显示这些信息。

public void Detect(object image)
        {
            if (image!=null &&  image is Bitmap)
            {
                try
                {
                    Bitmap img = (Bitmap)image;
                    var imgByte = Bitmap2Byte(img);
                    Image im =img ;
                    string image1 = ConvertImageToBase64(im);
                    string imageType = "BASE64";

                    if (imgByte != null)
                    {
                        // 如果有可选参数
                        var options = new Dictionary<string, object>{
                            {"max_face_num", 2},
                            {"face_fields", "age,qualities,beauty"}
                        };
                        var result = client.Detect(image1, imageType,options);
                        FaceDetectInfo detect = JsonHelper.DeserializeObject<FaceDetectInfo>(result.ToString());
                        if (detect!=null && detect.result_num>0)
                        {
                            ageText.Text = detect.result[0].age.TryToString();
                            this.location = detect.result[0].location;
                            StringBuilder sb = new StringBuilder();
                            if (detect.result[0].qualities != null)
                            {
                                if (detect.result[0].qualities.blur >= 0.7)
                                {
                                    sb.AppendLine("人脸过于模糊");
                                }
                                if (detect.result[0].qualities.completeness >= 0.4)
                                {
                                    sb.AppendLine("人脸不完整");
                                }
                                if (detect.result[0].qualities.illumination <= 40)
                                {
                                    sb.AppendLine("灯光光线质量不好");
                                }
                                if (detect.result[0].qualities.occlusion!=null)
                                {
                                    if (detect.result[0].qualities.occlusion.left_cheek>=0.8)
                                    {
                                        sb.AppendLine("左脸颊不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.left_eye >= 0.6)
                                    {
                                        sb.AppendLine("左眼不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.mouth >= 0.7)
                                    {
                                        sb.AppendLine("嘴巴不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.nose >= 0.7)
                                    {
                                        sb.AppendLine("鼻子不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.right_cheek >= 0.8)
                                    {
                                        sb.AppendLine("右脸颊不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.right_eye >= 0.6)
                                    {
                                        sb.AppendLine("右眼不清晰");
                                    }
                                    if (detect.result[0].qualities.occlusion.chin >= 0.6)
                                    {
                                        sb.AppendLine("下巴不清晰");
                                    }
                                    if (detect.result[0].pitch>=20)
                                    {
                                        sb.AppendLine("俯视角度太大");
                                    }
                                    if (detect.result[0].roll>=20)
                                    {
                                        sb.AppendLine("脸部应该放正");
                                    }
                                    if (detect.result[0].yaw>=20)
                                    {
                                        sb.AppendLine("脸部应该放正点");
                                    }
                                }
                                
                            }
                            if (detect.result[0].location.height<=100 || detect.result[0].location.height<=100)
                            {
                                sb.AppendLine("人脸部分过小");
                            }
                            textBox4.Text = sb.ToString();
                            if (textBox4.Text.IsNull())
                            {
                                textBox4.Text = "OK";
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    ClassLoger.Error("Form1.image", ex);
                }
            }
            
        }

我运行出来的结果:
在这里插入图片描述
里面可以显示这个人脸的很多信息,方位啊啥的,甚至还可以测颜值,我的只有61.49,hhhh

3. 人脸对比

人脸比对技术是一种将两张人脸图像进行比对,判断它们是否属于同一个人的技术。以下是一个C#代码示例,它通过百度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);
    }
}

这段代码就是先进行用户输入检查,检查用户是否已经选择了两张用于比对的人脸图片,然后从文本框中获取两张人脸图片的路径。然后通过构建人脸比对请求,创建了一个 JSON 数组 faces,其中包含两张人脸图片的信息。调用百度AI的 Match 方法,传入包含人脸信息的 JSON 数组 faces,进行人脸比对。可以返回包括其相似性啥的:
在这里插入图片描述
我这里选用的是同一个人的两张照片,相似度是92.34

人脸注册和人脸登录:

这里只展示一下效果:
我在上面的一、(6)里面写了,实际上这个API里面是有一个人脸库的,里面存有人脸。这里主要实现的就是,从你当前的摄像头中获取这一帧然后对应上你所选的组和你设定的用户名进行注册。这样就实现了人脸注册。
如果该用户已经存在了,则不需要再进行注册了,直接使用人脸登录即可。这时,摄像头就会获取你的当前帧然后与百度AI的那个库里面的所有人脸进行比对,如果相似度高于某个阈值则,返回这个人脸的名字,然后提升登录成功(我这里还加一个语音播报,如果识别成功了,还会有语音播报):
在这里插入图片描述
注册成功之后,点击人脸登录,就会把识别到的用户名返回给你:
在这里插入图片描述
这一块的代码,如果感兴趣可以私信我交流一下,这里就不展示出来。

三、总结

本博客展示了如何使用C#和百度AI接口实现人脸检测和人脸比对功能。第一段代码通过检测图像中的人脸,提取并分析人脸的质量属性,如年龄、模糊度和光照等,确保图像质量符合要求。第二段代码则进一步实现了人脸比对,通过比较两张人脸图像来确定它们是否属于同一个人。

后续人脸注册和人脸登录的代码,如果需要可以私我一下。
本博客如果对您有帮助,希望您能点个赞,谢谢!

  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值