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;} } }