using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using FaceAI;
namespace WIDESEAWCS_Common
{
public class BaiDuFaceHelper
{
#region 人脸识别API
///
/// 获取AccessToken
///
///
public static string GetAccessToken()
{
//string url = string.Format("https://aip.baidubce.com/oauth/2.0/token?client_id={0}&client_secret={1}&grant_type={2}", "TqFQHXSNt6Z7cPQ4vDBfBNjq", "0cli6I6s8JFz3qM1Czi5ciRpDqrJuVvm", "client_credentials");
//string returnStr = BDWebRequest(url, "", "POST");
//NLog.LogManager.GetCurrentClassLogger().Trace("百度人脸识别返回:" + returnStr);
//BDToken token = JsonConvert.DeserializeObject(returnStr);
//token.getdate = DateTime.Now.ToString();
//return token.access_token;
var str = "24.83aee44079e5a27530bc72d5ec7049a3.2592000.1746152354.282335-118294290";
return str;
}
public static string BDWebRequest(string url, string data, string method)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = string.IsNullOrEmpty(method) ? "POST" : method.ToUpper();
request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22";
request.ServicePoint.Expect100Continue = false;
request.Timeout = 1000 * 60;
request.ContentType = "application/x-www-form-urlencoded";
if (!string.IsNullOrEmpty(method) && method.ToUpper() == "POST" && !string.IsNullOrEmpty(data))
{
byte[] byteArray = Encoding.UTF8.GetBytes(data);
request.ContentLength = byteArray.Length;
using (Stream myRequestStream = request.GetRequestStream())
{
myRequestStream.Write(byteArray, 0, byteArray.Length);
}
}
HttpWebResponse myHttpWebResponse = (HttpWebResponse)request.GetResponse();
using (Stream response = myHttpWebResponse.GetResponseStream())
{
using (StreamReader reader = new StreamReader(response, Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
}
catch { return ""; }
}
///
/// 人脸检测与属性分析
///
///
public static string FaceDetect(string path)
{
string token = GetAccessToken();
string host = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=" + token;
var imgbase64 = GetFileContentAsBase64(path);
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "POST";
request.KeepAlive = true;
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("人脸检测与属性分析:" + result);
return result;
}
///
/// 创建用户人脸识别组
///
///
public static string GroupAdd(string group)
{
string token = GetAccessToken();
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add?access_token=" + token;
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "post";
request.KeepAlive = true;
String str = "{\"group_id\":\"" + group + "\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("创建用户组:" + result);
return result;
}
///
/// 获取文件base64编码
///
/// 文件路径
/// base64编码信息,不带文件头
//public static string GetFileContentAsBase64(string path)
//{
// using (FileStream filestream = new FileStream(path, FileMode.Open))
// {
// byte[] arr = new byte[filestream.Length];
// filestream.Read(arr, 0, (int)filestream.Length);
// string base64 = Convert.ToBase64String(arr);
// return base64;
// }
//}
public static string GetFileContentAsBase64(string filePath)
{
// 只保留文件名,避免路径错误
string fileName = Path.GetFileName(filePath);
// 获取文件的完整路径
string fullPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image", fileName);
if (!File.Exists(fullPath))
{
throw new FileNotFoundException("文件不存在:" + fullPath);
}
using (FileStream filestream = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
{
byte[] arr = new byte[filestream.Length];
filestream.Read(arr, 0, arr.Length);
return Convert.ToBase64String(arr);
}
}
///
/// 人脸注册
///
///
public static CreateUserResult AddUser(BDUserInfo info)
{
string token = GetAccessToken();
var imgbase64 = GetFileContentAsBase64(info.ImgPath);
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + token;
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "POST";
request.KeepAlive = true;
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("人脸注册:" + result);
CreateUserResult res = JsonConvert.DeserializeObject(result);//需要将log_id和face_token保存到用户表中,在人脸删除中需要用到
return res;
}
///
/// 人脸删除(删除用户的某一张人脸,如果该用户只有一张人脸图片,则同时删除用户。)
///
///
public static string DeleteUserImg(DeleteUserImg info)
{
string token = GetAccessToken();
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "POST";
request.KeepAlive = true;
String str = "{\"face_token\":\"" + info.face_token + "\",\"log_id\":\"" + info.log_id + "\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("人脸删除:" + result);
return result;
}
///
/// 用户删除
///
///
public static string DeleteUser(DeleteUserImg info)
{
string token = GetAccessToken();
string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "POST";
request.KeepAlive = true;
String str = "{\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("用户删除:" + result);
return result;
}
///
/// 人脸搜索
///
///
public static SearchResult FaceSearch(string path, string group_id_list)
{
string token = GetAccessToken();
var imgbase64 = GetFileContentAsBase64(path);
string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;
Encoding encoding = Encoding.Default;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
request.Method = "POST";
request.KeepAlive = true;
String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id_list\":\"" + group_id_list + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
byte[] buffer = encoding.GetBytes(str);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string result = reader.ReadToEnd();
NLog.LogManager.GetCurrentClassLogger().Trace("人脸搜索:" + result);
SearchResult searchResult = JsonConvert.DeserializeObject(result);
return searchResult;
}
#endregion
}
///
/// token获取信息
///
public class BDToken
{
///
/// 认证token
///
public string access_token { get; set; }
///
/// Access Token的有效期(秒为单位,有效期30天)
///
public int expires_in { get; set; }
///
/// 获取时间
///
public string getdate { get; set; }
}
///
/// 人脸注册信息
///
public class BDUserInfo
{
///
/// 图片路径(总数据大小应小于10M,分辨率应小于1920*1080)
///
public string ImgPath { get; set; }
///
/// 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制48B
///
public string group_id { get; set; }
///
/// 用户id(由数字、字母、下划线组成),对应系统账号
///
public string user_id { get; set; }
}
///
/// 人脸注册时返回对象
///
public class CreateUserResult
{
///
/// 检索成功返回0
///
public int error_code { get; set; }
public string error_msg { get; set; }
///
/// 请求标识码,随机数,唯一
///
public string log_id { get; set; }
public CreateUser result { get; set; }
}
public class CreateUser
{
///
/// 人脸图片的唯一标识
///
public string face_token { get; set; }
}
///
/// 人脸搜索时返回的对象
///
public class SearchResult
{
///
/// 检索成功返回0
///
public int error_code { get; set; }
public string error_msg { get; set;}
public UserResult result { get; set;}
}
public class UserResult
{
public string face_token { get; set; }
public List user_list { get; set;}
}
public class User_List
{
public string user_id { get; set; }
///
/// 用户的匹配得分,80分以上可以判断为同一人
///
public string score { get; set;}
}
///
/// 人脸删除的入参对象(只删除某一张图片,如果该用户只有一张图片,那该用户整体删除
///
public class DeleteUserImg
{
///
/// 请求标识码,随机数,唯一
///
public string log_id { get; set;}
///
/// 用户id(由数字、字母、下划线组成),长度限制48B
///
//public string user_id { get; set;}
public string user_id { get; set;}
///
/// 用户组id(由数字、字母、下划线组成) 长度限制48B,删除指定group_id中的user_id信息
///
public string group_id { get; set;}
///
/// 需要删除的人脸图片token,(由数字、字母、下划线组成)长度限制64B
///
public string face_token { get; set;}
}
}