qiuyao
2025-03-31 2fe6d35301dfb69dffc123e414d50c065579e7fd
新增人脸识别
已添加1个文件
342 ■■■■■ 文件已修改
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Common/BaiDuFaceHelper.cs 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Common/BaiDuFaceHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,342 @@
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;
namespace WIDESEAWCS_Common
{
    public class BaiDuFaceHelper
    {
        /// <summary>
        /// èŽ·å–AccessToken
        /// </summary>
        /// <returns></returns>
        public static string GetAccessToken()
        {
            string url = string.Format("https://aip.baidubce.com/oauth/2.0/token?client_id={0}&client_secret={1}", "TqFQHXSNt6Z7cPQ4vDBfBNjq", "0cli6I6s8JFz3qM1Czi5ciRpDqrJuVvm");
            string returnStr = BDWebRequest(url, "", "POST");
            NLog.LogManager.GetCurrentClassLogger().Trace("百度人脸识别返回:" + returnStr);
            BDToken token = JsonConvert.DeserializeObject<BDToken>(returnStr);
            token.getdate = DateTime.Now.ToString();
            return token.access_token;
        }
        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 ""; }
        }
        /// <summary>
        /// äººè„¸æ£€æµ‹ä¸Žå±žæ€§åˆ†æž
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// åˆ›å»ºç”¨æˆ·äººè„¸è¯†åˆ«ç»„
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// èŽ·å–æ–‡ä»¶base64编码
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>base64编码信息,不带文件头</returns>
        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;
            }
        }
        /// <summary>
        /// äººè„¸æ³¨å†Œ
        /// </summary>
        /// <returns></returns>
        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<CreateUserResult>(result);//需要将log_id和face_token保存到用户表中,在人脸删除中需要用到
            return res;
        }
        /// <summary>
        /// äººè„¸åˆ é™¤ï¼ˆåˆ é™¤ç”¨æˆ·çš„æŸä¸€å¼ äººè„¸ï¼Œå¦‚果该用户只有一张人脸图片,则同时删除用户。)
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// ç”¨æˆ·åˆ é™¤
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// äººè„¸æœç´¢
        /// </summary>
        /// <returns></returns>
        public static SearchResult FaceSearch(string path)
        {
            string token = GetAccessToken();
            var imgbase64 = GetFileContentAsBase64(path);
            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete?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\":\"1\",\"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<SearchResult>(result);
            return searchResult;
        }
    }
    /// <summary>
    /// token获取信息
    /// </summary>
    public class BDToken
    {
        /// <summary>
        /// è®¤è¯token
        /// </summary>
        public string access_token { get; set; }
        /// <summary>
        /// Access Token的有效期(秒为单位,有效期30天)
        /// </summary>
        public int expires_in { get; set; }
        /// <summary>
        /// èŽ·å–æ—¶é—´
        /// </summary>
        public string getdate { get; set; }
    }
    /// <summary>
    /// äººè„¸æ³¨å†Œä¿¡æ¯
    /// </summary>
    public class BDUserInfo
    {
        /// <summary>
        /// å›¾ç‰‡è·¯å¾„(总数据大小应小于10M,分辨率应小于1920*1080)
        /// </summary>
        public string ImgPath { get; set; }
        /// <summary>
        /// ç”¨æˆ·ç»„id,标识一组用户(由数字、字母、下划线组成),长度限制48B
        /// </summary>
        public int group_id { get; set; }
        /// <summary>
        /// ç”¨æˆ·id(由数字、字母、下划线组成),对应系统账号
        /// </summary>
        public string user_id { get; set; }
    }
    /// <summary>
    /// äººè„¸æ³¨å†Œæ—¶è¿”回对象
    /// </summary>
    public class CreateUserResult
    {
        /// <summary>
        /// æ£€ç´¢æˆåŠŸè¿”å›ž0
        /// </summary>
        public int error_code { get; set; }
        public string error_msg { get; set; }
        /// <summary>
        /// è¯·æ±‚标识码,随机数,唯一
        /// </summary>
        public string log_id {  get; set; }
        public CreateUser result { get; set; }
    }
    public class CreateUser
    {
        /// <summary>
        /// äººè„¸å›¾ç‰‡çš„唯一标识
        /// </summary>
        public string face_token {  get; set; }
    }
    /// <summary>
    /// äººè„¸æœç´¢æ—¶è¿”回的对象
    /// </summary>
    public class SearchResult
    {
        /// <summary>
        /// æ£€ç´¢æˆåŠŸè¿”å›ž0
        /// </summary>
        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> user_list { get; set;}
    }
    public class User_List
    {
        public string user_id { get; set; }
        /// <summary>
        /// ç”¨æˆ·çš„匹配得分,80分以上可以判断为同一人
        /// </summary>
        public string score { get; set;}
    }
    /// <summary>
    /// äººè„¸åˆ é™¤çš„入参对象(只删除某一张图片,如果该用户只有一张图片,那该用户整体删除
    /// </summary>
    public class DeleteUserImg
    {
        /// <summary>
        /// è¯·æ±‚标识码,随机数,唯一
        /// </summary>
        public int log_id { get; set;}
        /// <summary>
        /// ç”¨æˆ·id(由数字、字母、下划线组成),长度限制48B
        /// </summary>
        public string user_id { get; set;}
        /// <summary>
        /// ç”¨æˆ·ç»„id(由数字、字母、下划线组成) é•¿åº¦é™åˆ¶48B,删除指定group_id中的user_id信息
        /// </summary>
        public string group_id { get; set;}
        /// <summary>
        /// éœ€è¦åˆ é™¤çš„人脸图片token,(由数字、字母、下划线组成)长度限制64B
        /// </summary>
        public string face_token { get; set;}
    }
}