离线版人脸识别参考我的另外一篇博客:https://blog.csdn.net/GottaYiWanLiu/article/details/90442274
接着上一章unity3d人脸识别(一)来讲
本教程仅供参考学习使用
转载请注明出处
上一章讲到如何实现两张照片中的人脸对比,基于此功能,
本章将讲到如何通过摄像头捕捉到的人脸图像实现实时人脸识别对比,真正的实现刷脸功能,文末有完整工程链接
主要思路还是基于上一章实现的单个图片对比功能,本章是通过截取摄像头的某帧画面保存到本地图片,然后还是调用上一章的图片对比的功能,只不过这次的照片是摄像头实时获取的
上一章提供了完整的工程,本章将在上一章的工程中继续增加功能
1. 首先新建个C#脚本取名CallCamera,主要功能是用来调用外接摄像头,就一个调用摄像头的协程,本人默认分辨率1920x1080,刷新率20,然后在工程中新建一个rawImage,将获取到的画面显示出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CallCamera : MonoBehaviour
{
[HideInInspector]
public WebCamTexture webTex;
[HideInInspector]
public string deviceName;
//显示摄像头画面
public RawImage rawImage;
// Use this for initialization
void Start ()
{
StartCoroutine(IECallCamera());
}
IEnumerator IECallCamera()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{
WebCamDevice[] devices = WebCamTexture.devices;
deviceName = devices[0].name;
//设置摄像机摄像的区域
webTex = new WebCamTexture(deviceName, 1920, 1080, 20);
webTex.Play();//开始摄像
rawImage.texture = webTex;
}
}
}
上一章我们是在start()方法里调用StartCoroutine(IEGetStringBase64());识别一张图片的方法,先注释掉
摄像头画面已经能获取到了,此时我们要实现截图功能
2. 此时我们将Canvas的模式改为WorldSpace模式,然后在场景中复制MainCamera得到一个新的camera,取名CaptureCamre,专门用来截图,
然后打开FaceDetect脚本来添加代码
首先定义一个camera,把刚才场景中新建的captureCamera挂上去
//截取摄像头实时画面
public Camera cameras;
在StreamingAssets文件夹下新建个CameraFaceDetect文件夹用来保存摄像头画面的截图
3. 然后在代码中实现点击按钮截屏保存到本地,新建个Button,然后给Button添加事件BtnClick()
也可以实时自动检测人脸,逻辑是,当摄像头画面中出现人脸时自动开始截图上传对比,如果画面中没有人脸,则不作反应
如何判断画面中是否存在人脸,参考本人的另外一篇博客 https://blog.csdn.net/gottayiwanliu/article/details/90442274#comments
//截图
public void CaptureScreen()
{
Texture2D screenShot;
RenderTexture rt = new RenderTexture(1920, 1080, 1);
cameras.targetTexture = rt;
cameras.Render();
RenderTexture.active = rt;
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();
System.IO.File.WriteAllBytes(fileName, jpgData);
//人脸对比
CameraFaceSearch(fileName);
}
//实时摄像头人脸画面对比
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 = "group1";
var result = client.Search(image, imageType, groupIdList);
text.text = result.ToString();
Debug.Log(result);
}
//点击按钮开始截屏检测对比
public void BtnClick()
{
text.text = null;
CaptureScreen();
}
上一章提到的准备工作不能漏,提前人脸库中加入要对比的照片,
假如想拿自己做实验,首先拍几张自己的照片上传到识别库
上传不一定要在代码中上传,可以直接打开百度AI的控制台,找到自己的人脸识别应用的人脸识别库
新建分组,然后上传自己的照片即可
要和哪个组内照片作对比,那么CameraFaceSearch()方法里的groupIdList就要改成对应的组名,例如上图我新建了MySelf组,假设我在MySelf组里上传了照片并且我要和MySelf组里的照片做对比,那么groupIdList=“MySelf”;
然后点击开始检测按钮实现刷脸功能
不要忘了赋值自己的API_KEY和SECRET_KEY
工程链接:
链接:https://pan.baidu.com/s/1hlbQQXG-1sty1NEDxgx_tg 密码:duuf