using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Baidu.Aip.Face;
using System.IO;
using Newtonsoft.Json.Linq;
//百度人脸识别接口调用——非子萧
public class FaceTest : MonoBehaviour
{
public Text debugInfo; // 显示debug信息
public Text debugInfo2; // 显示debug信息
public RawImage portrait; // 显示图片
public Texture2D texture; // 用以描绘关键点的图片
private Face client; // 用来调用百度AI接口
private byte[] image; // 检测的图像数据
private Dictionary options; // 返回的数据
private JObject result; // 接收返回的结果
private string ApiKey = "Lgk3vC7FXQfQGW76zVg4pZKO";//此处填写自己申请的key
private string SecretKey = "bB8kbhl1Pnef3NG6MfG5AaYmI3SV53YC";//此处填写自己申请的key
private void Awake()
{
//网页端身份安全验证失败,我们需要在程序运行时手动添加安全证书,在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
};
// 此处填写自己申请的key("Api Key", "Secret Key");
client = new Face(ApiKey, SecretKey);
}
private void Start()
{
}
//人脸检测(检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息)
public void FaceDetect()
{
var path = Application.dataPath + "/Images/xxg1.jpg";
image = File.ReadAllBytes(path);
options = new Dictionary()
{
{"face_fields", "beauty,age,gender" }//返回的人脸信息选项+++
};
result = client.FaceDetect(image, options); // 调用API接口
debugInfo.text = result.ToString(); // 显示debug信息
//portrait.gameObject.SetActive(true);
// 复制原图信息
var width = texture.width;
var height = texture.height;
var mask = new Texture2D(width, height);
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
mask.SetPixel(i, j, texture.GetPixel(i, j));
}
// 根据返回的landmark描绘特征点
var r = result["result"];
foreach (var value in r)
{
var landmarks = value["landmark72"];
foreach (var lm in landmarks)
{
var x = int.Parse(lm["x"].ToString());
var y = height - int.Parse(lm["y"].ToString());
// 绘制点为3个像素点单位的正方形
// 这里其实应该保证绘制的像素点位置在我们检测图片的像素点范围内
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
mask.SetPixel(i, j, Color.red);
}
}
}
}
// 显示描绘特征点之后的图像
mask.Apply();
portrait.texture = mask;
}
//人脸对比(该请求用于比对多张图片中的人脸相似度并返回两两比对的得分,可用于判断两张脸是否是同一人的可能性大小。)
public void FaceMatch()
{
//可判断为同一人的相似度分值为80,
var path1 = Application.dataPath + "/Images/l01.jpg";
var image1 = File.ReadAllBytes(path1);
var image2 = File.ReadAllBytes(Application.dataPath + "/Images/l02.jpg");
var image3 = File.ReadAllBytes(Application.dataPath + "/Images/xxg1.jpg");
var images = new byte[][] { image1, image2, image3 };
result = client.FaceMatch(images); // 调用API接口
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸注册(要注册一个新用户,用户id为uid,加入组id为group1, 注册成功后服务端会返回操作的logid:)
public void FaceRegister()
{
var path = Application.dataPath + "/Images/l01.jpg";
var image1 = File.ReadAllBytes(path);
string uid = "ldh01";
string info = "我是大帅哥,华仔";
string groudid = "ldh";
result = client.User.Register(image1, uid, info, new[] { groudid });
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸更新(用于对人脸库中指定用户,更新其下的人脸图像)
public void FaceUpdate()
{
var path = Application.dataPath + "/Images/l02.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Update(image1, "ldh01", "ldh", "一如既往的帅");
debugInfo2.text = result.ToString(); // 显示debug信息
}
//人脸认证(用于识别上传的图片是否为指定用户,即查找前需要先确定要查找的用户在人脸库中的id。)
public void FaceVerify()
{
var path = Application.dataPath + "/Images/l03.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Verify(image1, "ldh01", new[] { "ldh" }, 1);
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸识别(用于计算指定组内用户,与上传图像中人脸的相似度。识别前提为您已经创建了一个人脸库。)
public void FaceIdentify()
{
var path = Application.dataPath + "/Images/l04.jpg";
var image1 = File.ReadAllBytes(path);
result = client.User.Identify(image1, new[] { "ldh" }, 1, 1);
debugInfo.text = result.ToString(); // 显示debug信息
}
//人脸删除(用于从人脸库中删除一个用户。)
public void FaceDelete()
{
result = client.User.Delete("ldh01");
result = client.User.Delete("ldh01", new[] { "ldh" });
debugInfo.text = result.ToString(); // 显示debug信息
}
//用户信息查询(用于查询人脸库中某用户的详细信息。)
public void UserInfo()
{
result = client.User.GetInfo("ldh01");
debugInfo.text = result.ToString(); // 显示debug信息
}
//组列表查询(用于查询用户组的列表。)
public void GroupList()
{
result = client.Group.GetAllGroups(0, 100);
debugInfo.text = result.ToString(); // 显示debug信息
}
//组内用户列表查询(用于查询指定用户组中的用户列表。)
public void GroupUsers()
{
result = client.Group.GetUsers("xxg", 0, 100);
debugInfo.text = result.ToString(); // 显示debug信息
}
//组间复制用户(用于将已经存在于人脸库中的用户添加到一个新的组。)
public void GroupAddUser()
{
//result = client.Group.AddUser(new[] { "toGroupId" }, "uid", "fromGroupId");
result = client.Group.AddUser(new[] { "xxg" }, "ldh01", "ldh");
debugInfo.text = result.ToString(); // 显示debug信息
}
//组内删除用户(用于将用户从某个组中删除,但不会删除用户在其它组的信息。)
public void GroupDeleteUser()
{
result = client.Group.DeleteUser(new[] { "xxg" }, "ldh01");
debugInfo.text = result.ToString(); // 显示debug信息
}
}