Unity 百度平台实现 简单的人脸识别系统

Unity 百度平台实现 简单的人脸识别系统


代码很简单没有难度,都有注解,随便 看一看 就会了。
要使用百度 AI 平台 需要注册 创建应用 和下载 相关SDK文件。
老规矩,直接上代码:

人脸识别系统

BttonCaptureClick() 方法需要 Button 搭载使用。
IEGetStringBase64()   本地图片上传 百度AI 开放平台 需要先执行一遍
SignUpFace()   人脸检测  这个方法 检测的是 百度平台的图片 活性、质量、数量等自定义参数(可忽略)
FaceSearch()   人脸校对   校对的 是 百度平台和本地图片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.Face;
using UnityEditor.PackageManager;
using System;
using System.IO;
using UnityEngine.UI;

/// <summary>
/// 人脸识别系统
/// </summary>

public class FaceDetect_ZH : MonoBehaviour
{
    // 设置APPID/AK/SK
    public string APP_ID = "19944561";
    public string _API_KEY = "syGQbK0C9bv5uffhUYWBGNpg";
    public string _SECRET_KEY = "1pL6uolwMnXqkIZsPI0iPS2sazLU3uyn";

    //截取摄像头实时画面
    [Header("捕获Camera")]
    public Camera _CaptureCamre;
    [Header("返回字符串")]
    public Text _ReturnString;
    

    private Face _Client;
    void Start()
    {
         _Client = new Face(_API_KEY, _SECRET_KEY);
        // 修改超时时间
        _Client.Timeout = 6000;

        //StartCoroutine(IEGetStringBase64());
        //FaceSearch();        
    }

    /// <summary>
    /// 人脸检测
    /// </summary>
    /// <param 图片信息="_Iamge"></param>
    /// <param 图片类型="_ImageType"></param>
    /// <param 用户组="_GroupID"></param>
    /// <param 用户ID="_UserID"></param>
    public void SignUpFace(string _Iamge, string _ImageType, string _GroupID, string _UserID)
    {
        //可选参数
        var _Options = new Dictionary<string, object>
        {
            {"_User_Info","Maddie" },
            {"_Quality_Control","NORMAL"},
            // NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率)
            //NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) 
            //HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
            { "_Liveness","Low"}
        };
        //带参数调用人脸注册
        var _Result = _Client.UserAdd(_Iamge, _ImageType, _GroupID, _UserID, _Options);
    }

    /// <summary>
    /// 本地图片上传 百度AI 开放平台
    /// </summary>
    /// <returns></returns>
    //获取图片base64字符串,由于QPS限制,此处采用协程降低注册频率
    IEnumerator IEGetStringBase64()
    {
        //获取到每一张图片的路径
        string[] _PicsPathArr = Directory.GetFiles(Application.streamingAssetsPath + "/FaceUpLoad/");
        //循环获取每张图片的base64字符串
        for (int i = 0; i < _PicsPathArr.Length; i++)
        {
            //unity会自动生成.meta文件,过滤掉
            if (_PicsPathArr[i].Contains("meta")) continue;
            //读取
            FileInfo _File = new FileInfo(_PicsPathArr[i]);
            var _Stream = _File.OpenRead();
            byte[] _Buffer = new byte[_File.Length];
            //读取图片字节流
            _Stream.Read(_Buffer, 0, Convert.ToInt32(_File.Length));
            //base64字符串
            string _ImageBase64 = Convert.ToBase64String(_Buffer);
            //采用base64字符串方式上传
            string _ImageType = "BASE64";
            //用户组
            string _GroupId = "GroupMaddie";
            //用户id,一般同一个人的图片放在同一个id下
            string _UserId = "Maddie";


            //开始注册
            SignUpFace(_ImageBase64, _ImageType, _GroupId, _UserId);


            yield return new WaitForSeconds(0.6f);
        }
    }

    /// <summary>
    /// 人脸校对
    /// </summary>
   public void FaceSearch()
    {
        //路径查询
        FileInfo _File = new FileInfo(Application.streamingAssetsPath + "/FaceDetect/C.jpg");
        //文件读取
        var _Stream = _File.OpenRead();
        byte[] _Buffer = new byte[_File.Length];

        //读取图片字节流
        _Stream.Read(_Buffer, 0, Convert.ToInt32(_File.Length));
        var _Image = Convert.ToBase64String(_Buffer);

        var _ImageType = "BASE64";
        //注册的组
        var _GroupIDList = "GroupMaddie";

        var _Options = new Dictionary<string, object>{
        {"face_field", "age"},
        {"max_face_num", 2},
        {"face_type", "LIVE"},
        {"liveness_control", "LOW"} };

        //返回的数据 (可用于解析)
        var _Result = _Client.Search(_Image, _ImageType, _GroupIDList, _Options);

        Debug.Log(_Result);
    }


    /// <summary>
    /// 屏幕捕获
    /// </summary>
    public void CaptureScreen()
    {
        Texture2D _ScreenShot;
        RenderTexture _RenderTex = new RenderTexture(1920, 1080, 1);
        _CaptureCamre.targetTexture = _RenderTex;
        _CaptureCamre.Render();
        RenderTexture.active = _RenderTex;
        _ScreenShot = new Texture2D(1920, 1080, TextureFormat.RGB24, false);
        _ScreenShot.ReadPixels(new Rect(0, 0, 1920, 1080), 0, 0);
        _ScreenShot.Apply();
        string _FileName = Application.streamingAssetsPath + "/CameraFaceDetect/" + "CameraFace.jpg";
        //保存到本地
        byte[] _JpgData = _ScreenShot.EncodeToJPG();
        File.WriteAllBytes(_FileName, _JpgData);
        //人脸对比
        CameraFaceSearch(_FileName);
    }

    /// <summary>
    /// 实时捕获图像与人脸对比
    /// </summary>
    /// <param 捕获图像地址="_FileName"></param>
    public void CameraFaceSearch(string _FileName)
    {
        FileInfo _File = new FileInfo(_FileName);
        var _Stream = _File.OpenRead();
        byte[] _Buffer = new byte[_File.Length];
        //读取图片字节流
        _Stream.Read(_Buffer, 0, Convert.ToInt32(_File.Length));
        var _Image = Convert.ToBase64String(_Buffer);

        var _ImageType = "BASE64";
        //之前注册的组
        var _GroupIdList = "GroupMaddie";

        var _Result = _Client.Search(_Image, _ImageType, _GroupIdList);
        _ReturnString.text = _Result.ToString();
        Debug.Log(_Result);
    }


    /// <summary>
    /// 屏幕捕获检测对比
    /// </summary>
    public void BttonCaptureClick()
    {
        _ReturnString.text = null;
        CaptureScreen();
    }
}

实时画面获取


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 实时画面获取
/// </summary>

public class CaptureCamre_ZH : MonoBehaviour
{

    [HideInInspector]
    //WebCam纹理是实时视频输入渲染到的纹理
    public WebCamTexture _WebTex;
    [HideInInspector]
    public string _DiviceName;

    //显示摄像头画面
    public RawImage _RawImage;

    void Start()
    {
        StartCoroutine(IECallCamera());
    }

    /// <summary>
    ///  外接摄像头调用
    /// </summary>
    /// <returns></returns>
    private IEnumerator IECallCamera()
    {
        //请求授权在iOS上使用网络摄像头或麦克风
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        //检查用户是否已授权在网络播放器中使用摄像头或麦克风
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            //返回可用设备的列表
            WebCamDevice[] _WebCamDevices = WebCamTexture.devices;

            _DiviceName = _WebCamDevices[0].name;

            //设置摄像机 摄像区域
            _WebTex = new WebCamTexture(_DiviceName, 1920, 1080, 20);
            //开始摄像
            _WebTex.Play();
            //图形赋值
            _RawImage.texture = _WebTex;
        }
    }
}

Score 值大于 90 就认定为 是 同一个人。

请添加图片描述

请添加图片描述

下载好相应的SDK  解压之后需要把这两个支持库 放到Unity Assets 文件夹下。 

在这里插入图片描述

暂时先这样吧,如果实在看不明白就留言,看到我会回复的。
也可以在百度 AI平台查看其相关文档和教程。
路长远兮,与君共勉。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maddie_Mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值