/// <summary> /// 人脸删除 /// </summary> /// <param name="model"></param> /// <returns></returns> public async Task<ActionResult> RemoveFace(FaceDatabaseModel.RemoveFaceModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } // 判断是否有同样的人,判断是否有此分组 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } // 判断此人相同数据是否已经存在 var group_user = await Service_user_face_storage.GetUser_By_UGS(model.user_id, group.id, model.face_token, model.secret_id); if (group_user == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } group_user.is_delete = true; group.updated_at = DateTime.Now; try { // 数据库删除,增加日志 await Service_user_face_storage.Remove_Storage_By_ApiUserIDFaceToken(group_user); request.Enum = RequestEnum.Succeed; } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; } return Ok(request); }
/// <summary> /// 获取用户列表 /// </summary> public async Task<ActionResult> ReadtGroupUserList(FaceDatabaseModel.GroupUserListModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } try { var userLists = await Service_user_face_storage.GetUser_Face_Storage_By_UGS_Asunc(model.secret_id, group.id, model.start, model.length); List<string> userIDList = new List<string>(); userLists.ForEach(x => { userIDList.Add(x.api_user_id); }); request.UserIdList = userIDList; request.Enum = RequestEnum.Succeed; } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.服务端请求失败; } return Ok(request); }
/// <summary> /// 删除用户组 /// </summary> /// <returns></returns> public async Task<ActionResult> RemoveGroup(FaceDatabaseModel.GroupModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; // 基本验证 var userFaceSet = Verify(ref request, model); if (userFaceSet == null) { return Ok(request); } // 是否重复验证 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } group.is_delete = true;//是否移除 group.updated_at = DateTime.Now; try { using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction()) { // 修改用户的删除状态 await Service_user_face_storage.Remove_Storage_By_Group(group, tra); // 修改用户组的删除状态 await Service_user_face_storage_group.Remove_storage_group(group, tra); tra.Commit(); request.Enum = RequestEnum.Succeed; } } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; } return Ok(request); }
/// <summary> /// 用户信息查询 /// </summary> /// <returns></returns> public async Task<ActionResult> ReadUserInfo(FaceDatabaseModel.GroupUserModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } List<FaceDatabaseModel.UserList> userLists = new List<FaceDatabaseModel.UserList>(); if (model.group_id == "@ALL") { userLists = await Service_user_face_storage.GetStorage_By_UGS_ALL<FaceDatabaseModel.UserList>(model.user_id, model.secret_id); } else { var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } userLists = await Service_user_face_storage.GetStorage_By_UGS<FaceDatabaseModel.UserList>(model.user_id, group.id, model.secret_id); } request.UserList = userLists.Select(x => new { user_info = x.api_user_info, group_id = x.group_name }); request.Enum = RequestEnum.Succeed; return Ok(request); }
public ActionResult GetSettings() { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null }; var setting = new { Version = CoinAppSettings.Instance.AppSettings.Version, RtmpServer = CoinAppSettings.Instance.AppSettings.RtmpServer }; request.Enum = RequestEnum.Succeed; request.Data = setting; return(Ok(request)); }
/// <summary> /// 获取用户人脸列表 /// </summary> /// <param name="model"></param> /// <returns></returns> public async Task<ActionResult> ReadtFaceList(FaceDatabaseModel.GroupUserModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } try { var userLists = await Service_user_face_storage.GetUserList_By_UGS(model.user_id, group.id, model.secret_id); request.Enum = RequestEnum.Succeed; request.FaceList = userLists.Select(x => new { x.face_token, ctime = x.created_at }); } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.服务端请求失败; } return Ok(request); }
/// <summary> /// 查找分组 /// </summary> /// <returns></returns> public async Task<ActionResult> ReadtGroupList(FaceDatabaseModel.GroupListModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; // 基本验证 var userFaceSet = Verify(ref request, model); if (userFaceSet == null) { return Ok(request); } try { List<string> groupIDList = new List<string>(); var groupList = await Service_user_face_storage_group.GetUser_Face_Storage_Groups_BySecretIdAsunc(model.secret_id, model.start, model.length); groupList.ForEach(x => { groupIDList.Add(x.group_name); }); request.GroupIdList = groupIDList; request.Enum = RequestEnum.Succeed; } catch (Exception ex) { LogHelperNLog.Error(ex, "查找数据出错"); request.Enum = RequestEnum.服务端请求失败; } return Ok(request); }
/// <summary> /// 基本验证 /// </summary> /// <param name="request"></param> /// <param name="model"></param> /// <returns></returns> public user_face_set Verify<T>(ref RequestFaceModel request, T model) { #region 基本验证 if (!ModelState.IsValid) { request.Message = ModelState.Where(e => e.Value.Errors.Count > 0).FirstOrDefault().Value.Errors[0].ErrorMessage; request.Status = (int)RequestEnum.必要参数未传入; return null; } // 根据 secretkey 获取set var userFaceSet = Service_user_face_set.GetUser_Face_Set_By_Secret_key((model as VerifyBase).secret_id); if (userFaceSet == null) { // 您未开通此项目 request.Enum = RequestEnum.没有接口权限; return null; } // 签名判断 var dic = ModleToDictionary.GetProperties(model); var key = userFaceSet.secret_key; dic.Remove("sign"); var sign = Signature.GetSign(dic, key); if (sign != (model as VerifyBase).sign) { // 签名错误 request.Enum = RequestEnum.签名错误; return null; } #endregion return userFaceSet; }
/// <summary> /// 复制用户 /// </summary> /// <returns></returns> public async Task<ActionResult> CopyGroupUser(FaceDatabaseModel.CopyUserListModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } // 判断是否存在此用户,是否存在此分组 // 判断是否有同样的人,判断是否有此分组 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.src_group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } var group_user = await Service_user_face_storage.GetUser_By_UGS(model.user_id, group.id, model.secret_id); if (group_user == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } var newgroup = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.dst_group_id); if (newgroup == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } var newgroup_user = await Service_user_face_storage.GetUser_By_UGS(model.user_id, newgroup.id, model.secret_id); if (newgroup_user != null) { request.Enum = RequestEnum.数据重复; return Ok(request); } group_user.api_group_id = newgroup.id; try { await SqlDapperHelper.ExecuteInsertAsync(group_user); request.Enum = RequestEnum.Succeed; } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; } return Ok(request); }
public async Task <ActionResult> FaceContrast([FromBody] FaceContrastViewModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; #region 基本验证 // 模型验证 if (!ModelState.IsValid) { request.Message = ModelState.Where(e => e.Value.Errors.Count > 0).FirstOrDefault().Value.Errors[0].ErrorMessage; request.Status = (int)RequestEnum.必要参数未传入; return(Ok(request)); } // 根据 secretkey 获取set var userFaceSet = await Service_user_face_set.GetUser_Face_Set_By_Secret_key_Async(model.secret_id); if (userFaceSet == null) { // 您未开通此项目 request.Enum = RequestEnum.没有接口权限; return(Ok(request)); } // 签名判断 var dic = ModleToDictionary.GetProperties(model); var key = userFaceSet.secret_key; dic.Remove("face_field"); dic.Remove("sign"); var sign = Signature.GetSign(dic, key); if (sign != model.sign) { // 签名错误 request.Enum = RequestEnum.签名错误; return(Ok(request)); } #endregion #region 余额逻辑判断 // 根据 userFaceSet.user_id 获取用户信息 var user = await Service_user.GetUser_By_User_id_Async(userFaceSet.user_id); //Service_user_face_compare_prepayment // 根据user_id 先查预付款,未查询到则扣费使用 var prepayment = await Service_user_face_compare_prepayment.GetUser_Face_Compare_Prepayment_By_User_id(user.id); user_face_compare_price comparePrice = null; if (prepayment == null || prepayment.number <= 0) { prepayment = null; comparePrice = await Service_user_face_compare_price.GetUser_Face_Compare_Price_By_User_idAsync(user.id); if (comparePrice == null) { // 用户没有预付费次数 request.Enum = RequestEnum.没有预付费次数未开通余额付款; } else { // 查询用户余额 derectPrice.price>余额 if (user.use_amount < comparePrice.price) { // 预付费次数为0,余额不足 request.Enum = RequestEnum.预付费次数为0且余额不足; } } } // 用户余额验证 if (!string.IsNullOrEmpty(request.Message)) { return(Ok(request)); } #endregion #region 获取图片 List <(Bitmap, string)> bitmaps = new List <(Bitmap, string)>(); List <ContrastData> face_tokens = new List <ContrastData>(); for (int i = 0; i < model.images.Count; i++) { var image = model.images[i]; var face_token = string.Empty; (Bitmap, string)bitmap = (null, null); // 获取图片文件 bitmap = image.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(image.image) : FileCommon.UrlToBitmap(image.image); if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2)) { if (image.image_type.ToUpper() == "BASE64") { request.Enum = RequestEnum.Base64图片格式错误; } else { request.Enum = RequestEnum.从图片的url下载图片失败; } return(Ok(request)); } #endregion #region 图片以及数据处理 // 查找是否有相同的图片 face_token = image.image_type.ToUpper() == "BASE64" ? EncryptProvider.Md5(image.image) : EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmap.Item1)); // 查询 图片库 // 判断是否还需要进行图片存储 var user_images = await Service_user_face_image_data.Getuser_face_image_data_By_Token_Async(face_token); if (user_images != null) { bitmap.Item2 = user_images.url; } else { try { // 存入本地 bitmap.Item2 = FileCommon.SaveBitmap(bitmap.Item1, bitmap.Item2); } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.数据存储处理失败; return(Ok(request)); } } bitmaps.Add(bitmap); face_tokens.Add(new ContrastData() { face_token = face_token }); } #region old Code //foreach (var image in model.images) //{ // // 变量初始化 // var face_token = string.Empty; // (Bitmap, string) bitmap = (null, null); // bitmap = image.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(image.image) : FileCommon.UrlToBitmap(image.image); // if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2)) // { // if (image.image_type.ToUpper() == "BASE64") // { // request.Enum = RequestEnum.Base64图片格式错误; // request.Message = string.IsNullOrEmpty(request.Message) ? num + RequestEnum.Base64图片格式错误.ToString() : request.Message + num + RequestEnum.Base64图片格式错误.ToString(); // } // else // { // request.Enum = RequestEnum.从图片的url下载图片失败; // request.Message = string.IsNullOrEmpty(request.Message) ? num + RequestEnum.从图片的url下载图片失败.ToString() : request.Message + num + RequestEnum.从图片的url下载图片失败.ToString(); // } // return Ok(request); // } // bitmaps.Add(bitmap); //} //#endregion //#region 图片以及数据处理 //List<ContrastData> face_tokens = new List<ContrastData>(); //for (int i = 0; i < bitmaps.Count; i++) //{ // var face_token = string.Empty; // face_token = EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmaps[i].Item1)); // //此处后期要更改为人脸库的图片 // var detect_Log = await Service_user_face_detect_log.GetUser_Face_Detect_Log_By_Face_token(face_token); // if (detect_Log != null) // { // bitmaps[i] = (bitmaps[i].Item1, detect_Log.image); // //bitmaps[i].Item2 = detect_Log.image; // } // else // { // try // { // // 存入本地 // bitmaps[i] = (bitmaps[i].Item1, FileCommon.SaveBitmap(bitmaps[i].Item1, bitmaps[i].Item2)); // } // catch (Exception ex) // { // LogHelperNLog.Error(ex); // request.Enum = RequestEnum.数据存储处理失败; // return Ok(request); // } // } // face_tokens.Add(new ContrastData() { // face_token=face_token // }); //} #endregion var difference = DnnFaceRecognitionCompute.GetOutputLabels(bitmaps[0].Item1, bitmaps[1].Item1); // 是否需要人脸位置 if (model.face_field.ToUpper().Contains("FACE_SHAPE")) { for (int i = 0; i < face_tokens.Count; i++) { face_tokens[i].rectangles = difference.Item2[i]; } } request.FaceList = face_tokens; request.Score = difference.Item1; #endregion request.Enum = RequestEnum.Succeed; //日志&&扣费 try { // 预付费/扣费 log // 时间戳 DateTime dateTime = DateTime.Now; user_face_compare_prepayment_detail prepayment_Detail = null; user_amount_detail amount_Detail = null; if (prepayment != null) { prepayment_Detail = new user_face_compare_prepayment_detail() { user_id = user.id, change_number = -1, now_number = prepayment.number - 1, info = string.Format("应用ID:{0}", model.secret_id), created_at = dateTime, updated_at = dateTime }; } else { amount_Detail = new user_amount_detail() { user_id = user.id, change_amount = -comparePrice.price, now_amount = user.use_amount - comparePrice.price, info = string.Format("应用ID:{0},费用:{1}", model.secret_id, comparePrice.price), created_at = dateTime, updated_at = dateTime, type = 0 }; } // 操作信息 user_face_compare_log face_Compare_Log = new user_face_compare_log() { user_id = user.id, secret_id = model.secret_id, image = JsonConvert.SerializeObject(bitmaps.Select(x => x.Item2)), is_deductions_success = true, api_respone = JsonConvert.SerializeObject(request, UnderlineSplitContractResolver.GetSettings()), timestamp = Timelong.GetUnixDateTime(model.timestamp), sign = sign, created_at = dateTime, updated_at = dateTime, }; // 修改余额,存库,日志 using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction()) { if (prepayment != null) { await SqlDapperHelper.ExecuteInsertAsync(prepayment_Detail, tra); await Service_user_face_compare_prepayment.MinusUsernumber_By_User_id(prepayment_Detail, tra); } else { await SqlDapperHelper.ExecuteInsertAsync(amount_Detail, tra); await Service_user.MinusUserAmount_By_User_id(amount_Detail); } await SqlDapperHelper.ExecuteInsertAsync(face_Compare_Log, tra); tra.Commit(); } } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; return(Ok(request)); } return(Ok(request)); }
public async Task <ActionResult> Login([FromBody] InputFaceModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null }; var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FaceImages", model.user_name); if (!Directory.Exists(filePath)) { request.Enum = RequestEnum.Failed; Console.WriteLine(request.Message); Thread.Sleep(5000); return(Ok(request)); } FaceContrast faceContrast = new FaceContrast(filePath); VideoCapture cap = null; try { if (model.rmtp_url == "0") { cap = new VideoCapture(0); } else { cap = new VideoCapture(model.rmtp_url); } var flag = false; var faceFlag = false; var bioFlag = false; QueueFixedLength <double> leftEarQueue = new QueueFixedLength <double>(10); QueueFixedLength <double> rightEarQueue = new QueueFixedLength <double>(10); QueueFixedLength <double> mouthQueue = new QueueFixedLength <double>(20); bool leftEarFlag = false; bool rightEarFlag = false; bool mouthFlag = false; using (var sp = ShapePredictor.Deserialize(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ShapeModel", "shape_predictor_5_face_landmarks.dat"))) using (var win = new ImageWindow()) { // Load face detection and pose estimation models. using (var detector = Dlib.GetFrontalFaceDetector()) using (var net = LossMetric.Deserialize(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ShapeModel", "dlib_face_recognition_resnet_model_v1.dat"))) using (var poseModel = ShapePredictor.Deserialize(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ShapeModel", "shape_predictor_68_face_landmarks.dat"))) { var ti = true; System.Timers.Timer t = new System.Timers.Timer(30000); t.Elapsed += new System.Timers.ElapsedEventHandler((object source, System.Timers.ElapsedEventArgs e) => { ti = false; }); t.AutoReset = false; t.Enabled = true; //抓取和处理帧,直到用户关闭主窗口。 while (/*!win.IsClosed() &&*/ ti) { try { // Grab a frame var temp = new Mat(); if (!cap.Read(temp)) { break; } //把OpenCV的Mat变成dlib可以处理的东西。注意 //包装Mat对象,它不复制任何东西。所以cimg只对as有效 //只要温度是有效的。也不要做任何可能导致它的临时工作 //重新分配存储图像的内存,因为这将使cimg //包含悬空指针。这基本上意味着您不应该修改temp //使用cimg时。 var array = new byte[temp.Width * temp.Height * temp.ElemSize()]; Marshal.Copy(temp.Data, array, 0, array.Length); using (var cimg = Dlib.LoadImageData <RgbPixel>(array, (uint)temp.Height, (uint)temp.Width, (uint)(temp.Width * temp.ElemSize()))) { // Detect faces var faces = detector.Operator(cimg); // Find the pose of each face. var shapes = new List <FullObjectDetection>(); for (var i = 0; i < faces.Length; ++i) { var det = poseModel.Detect(cimg, faces[i]); shapes.Add(det); } if (shapes.Count > 0) { // 活体检测 if (!bioFlag) { bioFlag = BioAssay(shapes[0], ref leftEarQueue, ref rightEarQueue, ref mouthQueue, ref leftEarFlag, ref rightEarFlag, ref mouthFlag); } } if (!faceFlag) { foreach (var face in faces) { var shape = sp.Detect(cimg, face); var faceChipDetail = Dlib.GetFaceChipDetails(shape, 150, 0.25); Matrix <RgbPixel> rgbPixels = new Matrix <RgbPixel>(cimg); var faceChip = Dlib.ExtractImageChip <RgbPixel>(rgbPixels, faceChipDetail); var faceDescriptors = net.Operator(faceChip); faceFlag = faceContrast.Contrast(faceDescriptors); } } Console.WriteLine(model.user_name + ":" + faceFlag); if (bioFlag && faceFlag) { flag = bioFlag && faceFlag; if (flag) { break; } } //在屏幕上显示 win.ClearOverlay(); win.SetImage(cimg); var lines = Dlib.RenderFaceDetections(shapes); win.AddOverlay(faces, new RgbPixel { Red = 72, Green = 118, Blue = 255 }); win.AddOverlay(lines); foreach (var line in lines) { line.Dispose(); } } } catch (Exception ex) { request.Message = ex.ToString(); break; } } } } if (flag) { request.Enum = RequestEnum.Succeed; } else { request.Enum = RequestEnum.Failed; } } catch (Exception ex) { request.Message = ex.ToString(); } finally { if (cap != null) { cap.Dispose(); } } Console.WriteLine(request.Message); return(Ok(request)); }
public async Task <ActionResult> Search(FaceFindModel.Search model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; #region 基本验证 // 模型验证 if (!ModelState.IsValid) { request.Message = ModelState.Where(e => e.Value.Errors.Count > 0).FirstOrDefault().Value.Errors[0].ErrorMessage; request.Status = (int)RequestEnum.必要参数未传入; return(Ok(request)); } // 根据 secretkey 获取set var userFaceSet = await Service_user_face_set.GetUser_Face_Set_By_Secret_key_Async(model.secret_id); if (userFaceSet == null) { // 您未开通此项目 request.Enum = RequestEnum.没有接口权限; return(Ok(request)); } // 签名判断 var dic = ModleToDictionary.GetProperties(model); var key = userFaceSet.secret_key; dic.Remove("sign"); var sign = Signature.GetSign(dic, key); if (sign != model.sign) { // 签名错误 request.Enum = RequestEnum.签名错误; return(Ok(request)); } #endregion #region 获取图片 var face_token = string.Empty; (Bitmap, string)bitmap = (null, null); // 获取图片文件 bitmap = model.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(model.image) : FileCommon.UrlToBitmap(model.image); if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2)) { if (model.image_type.ToUpper() == "BASE64") { request.Enum = RequestEnum.Base64图片格式错误; } else { request.Enum = RequestEnum.从图片的url下载图片失败; } return(Ok(request)); } #endregion #region 图片以及数据处理 // 查找是否有相同的图片 face_token = model.image_type.ToUpper() == "BASE64" ? EncryptProvider.Md5(model.image) : EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmap.Item1)); // 查询 图片库 // 判断是否还需要进行图片存储 var user_images = await Service_user_face_image_data.Getuser_face_image_data_By_Token_Async(face_token); if (user_images != null) { bitmap.Item2 = user_images.url; } else { try { // 存入本地 bitmap.Item2 = FileCommon.SaveBitmap(bitmap.Item1, bitmap.Item2); } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.数据存储处理失败; return(Ok(request)); } } #endregion //var bitmaps = "从数据库查询,然后加载Bitmap"; // 查询分组 var groupList = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id_list.Split(',')); // 查询到用户信息 var users = await Service_user_face_storage.GetUserList_By_UGS(model.user_id, groupList.Select(x => x.id).ToList(), model.secret_id); var bitmaps = FileCommon.SrcToBitmap(users.Select(x => x.image)); var difference = DnnFaceRecognitionCompute.GetOutputLabels(bitmap.Item1, bitmaps); // 过滤相识度 List <FaceFindOutModel.User> list = new List <FaceFindOutModel.User>(); for (int i = 0; i < bitmaps.Count; i++) { var group = groupList.FirstOrDefault(x => x.id == users[i].api_group_id); list.Add(new FaceFindOutModel.User { GroupId = group != null ? group.group_name : null, UserId = users[i].api_user_id, UserInfo = users[i].api_user_info, Score = difference[i].Item1 }); } request.FaceToken = face_token; request.FaceList = list; // 数据处理,存库,日志 return(Ok(request)); }
/// <summary> /// 删除用户 /// </summary> /// <returns></returns> public async Task<ActionResult> RemoveUser(FaceDatabaseModel.GroupUserModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } // 判断是否存在此用户,是否存在此分组 // 判断是否有同样的人,判断是否有此分组 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } user_face_storage group_user = null; if (model.group_id == "@ALL") { group_user = await Service_user_face_storage.GetUser_By_UGS_ALL(model.user_id, model.secret_id); } else { group_user = await Service_user_face_storage.GetUser_By_UGS(model.user_id, group.id, model.secret_id); } if (group_user == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } user_face_storage user = new user_face_storage() { is_delete = true, updated_at = DateTime.Now, secret_id = model.secret_id }; try { // 数据库删除,增加日志 if (model.group_id == "@ALL") { await Service_user_face_storage.Remove_Storage_By_ApiUserID_All(user); } else { user.api_group_id = group.id; await Service_user_face_storage.Remove_Storage_By_ApiUserID(user); } request.Enum = RequestEnum.Succeed; } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; } return Ok(request); }
public async Task <ActionResult> InputFaceData([FromBody] InputFaceModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null }; VideoCapture cap = null; try { if (model.rmtp_url == "0") { cap = new VideoCapture(0); } else { cap = new VideoCapture(model.rmtp_url); } var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FaceImages", model.user_name); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } int i = 0; int num = 0; ////using (var win1 = new ImageWindow()) //using (var win = new ImageWindow()) //{ // Load face detection and pose estimation models. using (var detector = Dlib.GetFrontalFaceDetector()) using (var sp = ShapePredictor.Deserialize(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ShapeModel", "shape_predictor_5_face_landmarks.dat"))) { //抓取和处理帧,直到用户关闭主窗口。 while (/*!win.IsClosed()*/ true) { try { // Grab a frame var temp = new Mat(); if (!cap.Read(temp)) { break; } //把OpenCV的Mat变成dlib可以处理的东西。注意 //包装Mat对象,它不复制任何东西。所以cimg只对as有效 //只要温度是有效的。也不要做任何可能导致它的临时工作 //重新分配存储图像的内存,因为这将使cimg //包含悬空指针。这基本上意味着您不应该修改temp //使用cimg时。 var array = new byte[temp.Width * temp.Height * temp.ElemSize()]; Marshal.Copy(temp.Data, array, 0, array.Length); using (var cimg = Dlib.LoadImageData <RgbPixel>(array, (uint)temp.Height, (uint)temp.Width, (uint)(temp.Width * temp.ElemSize()))) { // Detect faces var faces = detector.Operator(cimg); if (i % 7 == 0) { foreach (var face in faces) { var shape = sp.Detect(cimg, face); var faceChipDetail = Dlib.GetFaceChipDetails(shape, 150, 0.25); var faceChip = Dlib.ExtractImageChip <RgbPixel>(cimg, faceChipDetail); //win1.ClearOverlay(); //win1.SetImage(faceChip); Dlib.SaveJpeg(faceChip, Path.Combine(filePath, DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss-fff") + ".jpg")); num++; } } i++; if (num >= 7) { break; } //在屏幕上显示 //win.ClearOverlay(); //win.SetImage(cimg); //win.AddOverlay(faces, new RgbPixel { Red = 72, Green = 118, Blue = 255 }); } } catch (Exception ex) { request.Message = ex.ToString(); break; } } } //} request.Enum = RequestEnum.Succeed; } catch (Exception ex) { request.Message = ex.ToString(); } finally { if (cap != null) { cap.Dispose(); } } return(Ok(request)); }
/// <summary> /// 人脸更新 /// </summary> /// <returns></returns> public async Task<ActionResult> UpdateFace(FaceDatabaseModel.UserFaceModel model) { // 一系列检查 RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; var userFaceSet = Verify(ref request, model); // 基本验证 if (userFaceSet == null) { return Ok(request); } // 判断是否存在此用户,是否存在此分组 // 判断是否有同样的人,判断是否有此分组 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } user_face_storage group_user = null; if (model.group_id == "@ALL") { group_user = await Service_user_face_storage.GetUser_By_UGS_ALL(model.user_id, model.secret_id); } else { group_user = await Service_user_face_storage.GetUser_By_UGS(model.user_id, group.id, model.secret_id); } if (group_user == null) { request.Enum = RequestEnum.数据不存在; return Ok(request); } // 将以前的人脸状态变为删除 user_face_storage user = new user_face_storage() { is_delete = true, updated_at = DateTime.Now, secret_id = model.secret_id }; // 增加一个人脸 #region 获取图片 var face_token = string.Empty; (Bitmap, string) bitmap = (null, null); // 获取图片文件 bitmap = model.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(model.image) : FileCommon.UrlToBitmap(model.image); if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2)) { if (model.image_type.ToUpper() == "BASE64") { request.Enum = RequestEnum.Base64图片格式错误; } else { request.Enum = RequestEnum.从图片的url下载图片失败; } return Ok(request); } #endregion #region 图片以及数据处理 // 查找是否有相同的图片 face_token = model.image_type.ToUpper() == "BASE64" ? EncryptProvider.Md5(model.image) : EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmap.Item1)); // 查询 图片库 var user_images = await Service_user_face_image_data.Getuser_face_image_data_By_Token_Async(face_token); if (user_images != null) { bitmap.Item2 = user_images.url; } else { try { // 存入本地 bitmap.Item2 = FileCommon.SaveBitmap(bitmap.Item1, bitmap.Item2); } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.数据存储处理失败; return Ok(request); } } // 获取人脸数据 //var faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1); DlibDotNet.Rectangle[] faceDate = new DlibDotNet.Rectangle[0]; try { // 截取人像,面积排序 faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1).OrderByDescending(d => d.Area).Take(1).ToArray(); } catch (Exception ex) { LogHelperNLog.Error(ex, "FaceDetectionCompute.GetRectangles:人脸获取坐标出错"); request.Enum = RequestEnum.无法解析人脸; return Ok(request); } #endregion request.Enum = RequestEnum.Succeed; request.Location = faceDate; #region 日志&&扣费 try { DateTime dateTime = DateTime.Now; // 图片保存到数据库 user_images = new user_face_image_data() { token = face_token, url = bitmap.Item2, created_at = dateTime, updated_at = dateTime }; //查找分组信息 user.api_group_id = group.id; //用户信息 user_face_storage face_Storage = new user_face_storage() { user_id = userFaceSet.user_id, secret_id = model.secret_id, face_token = face_token, image = bitmap.Item2, image_type = model.image_type, api_group_id = group.id, api_user_id = model.user_id, api_user_info = model.user_info, quality_control = model.quality_control, liveness_control = model.quality_control, sign = model.sign, timestamp = model.timestamp, is_delete = false, api_respone = JsonConvert.SerializeObject(request, UnderlineSplitContractResolver.GetSettings()), created_at = dateTime, updated_at = dateTime }; using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction()) { await Service_user_face_storage.Remove_Storage_By_ApiUserID(user, tra); if (user_images == null) { await Service_user_face_image_data.Creatuser_face_image_data(user_images, tra); } await SqlDapperHelper.ExecuteInsertAsync(face_Storage, tra); tra.Commit(); } } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; } #endregion return Ok(request); }
/// <summary> /// 创建用户组 /// </summary> /// <returns></returns> public async Task<ActionResult> CreatGroup(FaceDatabaseModel.GroupModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; //FaceDatabaseModel.CreatGroupModel creatGroup = new FaceDatabaseModel.CreatGroupModel(); // 基本验证 var userFaceSet = Verify(ref request, model); if (userFaceSet == null) { return Ok(request); } // 是否重复验证 var group = await Service_user_face_storage_group.Get_storage_group_BySecretGroupAsync(model.secret_id, model.group_id); if (group != null) { request.Enum = RequestEnum.数据重复; return Ok(request); } // 扣费等验证 // 保存到数据库 request.Enum = RequestEnum.Succeed; DateTime dateTime_Now = DateTime.Now; try { using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction()) { long num = 0; user_face_storage_group storage_Group = new user_face_storage_group() { user_id = userFaceSet.user_id, group_name = model.group_id, remake = "", created_at = dateTime_Now, secret_id = model.secret_id, updated_at = dateTime_Now, api_respone = JsonConvert.SerializeObject(request, UnderlineSplitContractResolver.GetSettings()), is_delete = false }; num += await SqlDapperHelper.ExecuteInsertAsync(storage_Group); if (num >= 0) { tra.Commit(); } else { request.Enum = RequestEnum.数据存储处理失败; } } } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; return Ok(request); } return Ok(request); }
/// <summary> /// 获取人脸坐标(单个文件) /// </summary> /// <param name="files"></param> /// <returns></returns> public async Task <ActionResult> GetFaceLocation(FaceLocationsViewModel model) { RequestFaceModel request = new RequestFaceModel() { Status = 500, Message = null, FaceList = null }; #region 基本验证 // 模型验证 if (!ModelState.IsValid) { request.Message = ModelState.Where(e => e.Value.Errors.Count > 0).FirstOrDefault().Value.Errors[0].ErrorMessage; request.Status = (int)RequestEnum.必要参数未传入; return(Ok(request)); } // 根据 secretkey 获取set var userFaceSet = await Service_user_face_set.GetUser_Face_Set_By_Secret_key_Async(model.secret_id); if (userFaceSet == null) { // 您未开通此项目 request.Enum = RequestEnum.没有接口权限; return(Ok(request)); } // 签名判断 var dic = ModleToDictionary.GetProperties(model); var key = userFaceSet.secret_key; dic.Remove("sign"); var sign = Signature.GetSign(dic, key); if (sign != model.sign) { // 签名错误 request.Enum = RequestEnum.签名错误; return(Ok(request)); } #endregion #region 余额逻辑判断 // 根据 userFaceSet.user_id 获取用户信息 var user = await Service_user.GetUser_By_User_id_Async(userFaceSet.user_id); // 根据user_id 先查预付款,未查询到则扣费使用 var prepayment = await Service_user_face_detect_prepayment.GetUser_Face_Detect_Prepayment_By_User_id_Asynv(user.id); user_face_detect_price derectPrice = null; if (prepayment == null || prepayment.number <= 0) { prepayment = null; derectPrice = await Service_user_face_detect_price.GetUser_Face_Detect_Price_By_User_idAsync(user.id); if (derectPrice == null) { // 用户没有预付费次数 request.Enum = RequestEnum.没有预付费次数未开通余额付款; } else { // 查询用户余额 derectPrice.price>余额 if (user.use_amount < derectPrice.price) { // 预付费次数为0,余额不足 request.Enum = RequestEnum.预付费次数为0且余额不足; } } } // 用户余额验证 if (!string.IsNullOrEmpty(request.Message)) { return(Ok(request)); } #endregion #region 获取图片 // 变量初始化 var face_token = string.Empty; (Bitmap, string)bitmap = (null, null); if (model.image_type.ToUpper() == "FACE_TOKEN") { if (model.image.Length > 50) { request.Enum = RequestEnum.face_token格式错误; return(Ok(request)); } var detect = await Service_user_face_detect_log.GetUser_Face_Detect_Log_By_Face_token(model.image); if (detect == null) { request.Enum = RequestEnum.face_token不存在; return(Ok(request)); } bitmap.Item2 = detect.image; var obj = JsonConvert.DeserializeObject <dynamic>(detect.api_respone); request.FaceList = obj.face_list; request.FaceNum = obj.face_num; face_token = model.image; } else { // 获取图片文件 bitmap = model.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(model.image) : FileCommon.UrlToBitmap(model.image); if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2)) { if (model.image_type.ToUpper() == "BASE64") { request.Enum = RequestEnum.Base64图片格式错误; } else { request.Enum = RequestEnum.从图片的url下载图片失败; } return(Ok(request)); } } #endregion #region 图片以及数据处理 // 不是 FACE_TOKEN 的处理方式 if (model.image_type.ToUpper() != "FACE_TOKEN") { // 查找是否有相同的图片 face_token = model.image_type.ToUpper() == "BASE64" ? EncryptProvider.Md5(model.image) : EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmap.Item1)); var detect_Log = await Service_user_face_detect_log.GetUser_Face_Detect_Log_By_Face_token(face_token); if (detect_Log != null) { bitmap.Item2 = detect_Log.image; } else { try { // 存入本地 bitmap.Item2 = FileCommon.SaveBitmap(bitmap.Item1, bitmap.Item2); } catch (Exception ex) { LogHelperNLog.Error(ex); request.Enum = RequestEnum.数据存储处理失败; return(Ok(request)); } } // 获取人脸数据 //var faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1); DlibDotNet.Rectangle[] faceDate = new DlibDotNet.Rectangle[0]; try { // 截取人像,面积排序 faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1).OrderByDescending(d => d.Area).Take(model.max_face_num).ToArray(); //faceDate = FaceDetectionCompute.GetResult(bitmap.Item2); } catch (Exception ex) { LogHelperNLog.Error(ex, "FaceDetectionCompute.GetRectangles:人脸获取坐标出错"); request.Enum = RequestEnum.无法解析人脸; return(Ok(request)); } // 人脸关键点识别 var landmark68 = FaceLandmarkDetectionCompute.DetsTolandmark68(bitmap.Item1, faceDate); if (model.face_field.ToUpper().Contains("LANDMARK")) { request.LandmarkList = landmark68.Select(x => x.Item1); } // 人脸旋转角度 var angles = FaceDetectionCompute.GetRotationAngle(landmark68.Select(x => x.Item2)); // 人脸之态预测 var gesture = FaceDetectionCompute.GetFaceGesture(landmark68.Select(x => x.Item2), bitmap.Item1.Width, bitmap.Item1.Height); if (faceDate != null) { // 返回数据格式处理 var json = JsonConvert.SerializeObject(faceDate); var data = JsonConvert.DeserializeObject <List <FaceLocationsOutMdole> >(json); //data = data.OrderByDescending(d => d.Area).Take(model.max_face_num).ToList(); data.ForEach(x => { x.FaceToken = face_token; }); for (int i = 0; i < data.Count; i++) { data[i].FaceToken = face_token; data[i].Angle = angles[i]; data[i].Gesture = new Gesture() { Pitch = gesture[i].Item1, Yaw = gesture[i].Item2, Roll = gesture[i].Item3 }; } request.FaceList = data; request.FaceNum = data.Count(); } } #endregion request.Enum = RequestEnum.Succeed; #region 日志&&扣费 try { // 预付费/扣费 log // 时间戳 DateTime dateTime = DateTime.Now; user_face_detect_prepayment_detail prepayment_Detail = null; user_amount_detail amount_Detail = null; if (prepayment != null) { prepayment_Detail = new user_face_detect_prepayment_detail() { user_id = user.id, change_number = -1, now_number = prepayment.number - 1, info = string.Format("应用ID:{0},图片名称:{1}", model.secret_id, bitmap.Item2), created_at = dateTime, updated_at = dateTime }; } else { amount_Detail = new user_amount_detail() { user_id = user.id, change_amount = -derectPrice.price, now_amount = user.use_amount - derectPrice.price, info = string.Format("应用ID:{0},图片名称:{1},费用:{2}", model.secret_id, bitmap.Item2, derectPrice.price), created_at = dateTime, updated_at = dateTime, type = 0 }; } // 操作信息 user_face_detect_log face_Detect_Log = new user_face_detect_log() { user_id = user.id, secret_id = model.secret_id, face_token = face_token, image = bitmap.Item2, image_type = model.image_type, face_field = model.face_field, max_face_num = model.max_face_num, face_type = model.face_type, is_deductions_success = true, api_respone = JsonConvert.SerializeObject(request, UnderlineSplitContractResolver.GetSettings()), timestamp = Timelong.GetUnixDateTime(model.timestamp), sign = sign, created_at = dateTime, updated_at = dateTime, is_search = 1, }; // 修改余额,存库,日志 using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction()) { if (prepayment != null) { await SqlDapperHelper.ExecuteInsertAsync(prepayment_Detail, tra); await Service_user_face_detect_prepayment.MinusUsernumber_By_User_id(prepayment_Detail, tra); } else { await SqlDapperHelper.ExecuteInsertAsync(amount_Detail, tra); await Service_user.MinusUserAmount_By_User_id(amount_Detail); } await SqlDapperHelper.ExecuteInsertAsync(face_Detect_Log, tra); tra.Commit(); } } catch (Exception ex) { LogHelperNLog.Error(ex, "操作日志添加失败"); request.Enum = RequestEnum.操作日志添加失败; return(Ok(request)); } #endregion return(Ok(request)); }