Unity人脸识别(一),基于百度大脑的Unity3d&C#简单的人脸对比(搜索)功能,适合小白入门

离线版人脸识别参考我的另外一篇博客:https://blog.csdn.net/GottaYiWanLiu/article/details/90442274

 

最近忽然对物联网开发蛮感兴趣,但无奈物联网内容太高深,我就做一点我能力范围内的事

本文主要介绍unity3d开发基于百度大脑的人脸对比功能,人脸对比的发展方向很多,如果往物联网方向走,可以做成一个刷脸门禁系统,代替传统的指纹门禁系统;其他典型应用场景:如人证合一验证,用户验证等等

主要是对比两张人脸的相似度(下一篇将会实现摄像头画面实施人脸识别,真正实现刷脸功能)

话不多说,接下来就是正文

文末有完整工程

1.准备工作:

首先需要登录百度大脑,然后在控制台选择人脸识别

 

 

进入后,我们创建一个新应用,应用名称和应用描述随便写,只要自己能辨别就行,创建完后,点击查看应用详情

 

 

在应用详情界面,我们可以看到自己的应用名称,AppID、APIKey、SecretKey,这些后续开发是要用到的

 

然后返回百度大脑首页,在开发资源中下载人脸识别C# SDK

 

 

下载后打开net35文件夹,其中AipSdk.dll和Newtonsoft.Json.dll两个引用后续我们要加到Unity3d工程里

 

 

2.正式开始:

   新建个Unity3d工程,我们需要先将Api Compatibility Level设置成 .NET2.0,

在File>BuildSettings>PlayerSettings>OtherSettings下

 

 

 

此时在Assets下新建一个Plugins文件夹,我们将之前下载的AipSdk.dll和Newtonsoft.Json.dll复制到该文件夹下

新建个场景FaceDetect,新建个C#脚本FaceDetect(命名随意)

 

    此时我们可以打开官方文档,教程很详细

 

 

    定义一个客户端,此时要用到之前创建的应用的APIKey和SecretKey

    

using Newtonsoft.Json.Linq;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Baidu.Aip.Face;
using System.Text;
using System;
using UnityEngine.UI;


public class FaceDetect : MonoBehaviour
{
    public string API_KEY = "之前创建的应用的API_KEY";
    public string SECRET_KEY = "之前创建的应用的SECRET_KEY ";
    Face client;
    
    void Start()
    {
        client = new Face(API_KEY, SECRET_KEY);
    }
}

 

 

 

   首先我们先注册几个人脸,官网教程如下,各个参数说明也很清楚

 

 

 

 

注册人脸

 //人脸注册
    public void SignUpFace(string image, string imageType, string groupId, string userId)
    {    
        var options = new Dictionary<string, object>{
        {"user_info", "LiYanHong"},
        {"quality_control", "NORMAL"},
        {"liveness_control", "LOW"}
    };
        // 带参数调用人脸注册
        var result = client.UserAdd(image, imageType, groupId, userId, options);
     
    }

 

 

 

       注册人脸,其实就是上传图片到百度大脑人脸识别库;如果是上传本地图片,则需获取图片的BASE64字符串或者FACE__TOKEN字符串(这个我没用过,暂时用不上);也可以直接用通过url上传。

   

      我们这里采用上传本地图片

      事先在网上下载几张李彦宏(随便你用谁)的图片保存到新建的StreamingAssets文件夹下的FaceUpLoad文件夹下

  

   

 

 

       我们这里采用BASE64字符串,首先我们需要获取到图片的BASE64字符串; 由于百度大脑给我限制的QPS是2,我只能降低注册频率

 
//获取图片base64字符串,由于QPS限制,此处采用协程降低注册频率
    IEnumerator IEGetStringBase64()
    {
        //获取到每一张图片的路径
        string[] picsPathArr = Directory.GetFiles(Application.streamingAssetsPath + "/FaceDetect/");
        //循环获取每张图片的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 = "group1";
            //用户id,一般同一个人的图片放在同一个id下
            string userId = "liyanhong";


            //开始注册
            SignUpFace(imageBase64, imageType, groupId, userId);


            yield return new WaitForSeconds(0.6f);
        }
    }

      

 

      注册完后我们可以在百度大脑的控制台找到之前创建的应用的人脸识别库里看到上传的图片(同样的图片不要重复注册)

 

 

         注册完后,就是我们核心内容,人脸对比(此功能在官网叫做人脸搜索,人脸对比指的是另一个,意思都一样)

       用此图片和人脸库里的图片做对比,官网教程和各个参数说明如下

   

    

    

       此时我们另外弄一张之前人脸库里没有的李彦宏的图片保存到FaceDetect文件夹下

    

      对比

 //人脸对比
    public void FaceSearch()
    {
        FileInfo file = new FileInfo(Application.streamingAssetsPath + "/FaceDetect/001.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 = "group1";

        var result = client.Search(image, imageType, groupIdList);

        Debug.Log(result);
    }

         对比后会返回一组数据,其中我们只要看score的值,我们可以约定,只要score值超过80,就认定是同一个人

 

 

    如果遇到报错

 

    请添加以下代码

 void Awake()
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
               {
                   return true; // **** Always accept
               };
    }

 

注意:

代码中的groupid需要改成自己的人脸识别库中创建的的groupid

userid需要改成自己的人脸识别库中的userid

 

如下图,“group1”就是我的groupid

 

点击group1,在group1下一级就是userid了,如下图,“liyanhong”就是我的userid

 

 

 

    最后附上完整工程

   链接:https://pan.baidu.com/s/1R7TkKGKp9HUZ0UyBGhMCeg 密码:njud

   运行前记得填写自己的API_KEY和SECRET_KEY

   

  • 21
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
### 回答1: Unity是一款跨平台的游戏引擎,它可以用于开发各种类型的游戏和应用程序。在Unity中,摄像头识别是指利用摄像头捕捉图像,并进行图像处理、分析和识别的功能Unity提供了相机组件,可以通过将相机组件添加到场景中的游戏对象上来实现摄像头识别。相机组件可以设置摄像头的位置、方向和视野范围等参数,来控制摄像头的行为。 在摄像头识别中,一般会使用图像处理和计算机视觉算法来实现对象的识别和跟踪。Unity提供了OpenCV等图像处理库的接口,可以方便地进行图像处理和分析。通过将摄像头捕获的图像传入图像处理算法,可以实现对图像中目标对象的识别和跟踪。 除了基本的摄像头捕获和图像处理功能Unity还提供了一些辅助工具和插件,可以帮助开发者更方便地实现摄像头识别。例如,Vuforia是一款强大的增强现实引擎,可以与Unity集成,提供全面的增强现实功能,包括图像识别、目标跟踪和虚拟物体的叠加等。 总而言之,Unity摄像头识别是利用Unity引擎的相机组件和图像处理算法,实现对摄像头捕获的图像进行分析和识别的功能。通过这个功能,开发者可以开发出基于摄像头的交互应用程序,如增强现实游戏、人脸识别应用等。 ### 回答2: Unity 摄像头识别是指使用Unity引擎中的摄像头功能来实现图像识别和物体追踪的技术。Unity引擎提供了强大的摄像头模块,可以让开发者在游戏或应用中利用摄像头实现各种功能。 在Unity中,通过使用WebCamTexture类可以轻松地获取和操作摄像头图像。开发者可以通过调用该类的构造函数来创建WebCamTexture实例,然后将其应用于游戏对象的渲染器或材质。这样,摄像头捕捉到的图像就会在游戏中实时显示出来。 利用WebCamTexture,开发者可以实现摄像头识别功能。例如,可以使用OpenCV等开源图像处理库来对摄像头捕获的图像进行处理,实现图像识别、人脸识别功能。开发者可以编写自定义的算法对图像进行分析和处理,从而实现特定的应用场景,如虚拟现实、增强现实等。 除了图像识别,Unity摄像头还可以用于实现物体追踪功能。通过将摄像头的图像与预定义的模型或目标进行比较,可以实时追踪特定物体的位置和姿态。这对于游戏开发或增强现实应用来说非常有用,可以实现虚拟物体与真实场景的交互。 总而言之,Unity摄像头识别是指利用Unity引擎中的摄像头功能实现图像识别和物体追踪的技术。开发者可以利用摄像头实时获取图像,并使用各种开源图像处理库和自定义算法对图像进行处理和分析,从而实现不同的应用场景,如虚拟现实、增强现实等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值