public RCSService() : base() { if (!isFirstTrained) { var trainModels = getAllTrainModel(); if (trainModels.Count > 0) { DetectService.AddTrainModels(trainModels); isFirstTrained = true; } } }
public ApiResult <int> DeleteFile(int fileId) { var ar = new ApiResult <int>(); var trainingImage = RCSContext.TrainingImages.Where(t => t.FileId == fileId).FirstOrDefault(); if (trainingImage == null) { ar.Data = fileId; ar.IsSuccess = false; ar.Messages.Add("Không tìm thấy file."); return(ar); } ar.Data = fileId; RCSContext.TrainingImages.Remove(trainingImage); RCSContext.SaveChanges(); DetectService.RemoveTrainsByImageId(trainingImage.FileId); ar.IsSuccess = true; ar.Messages.Add("Xóa file thành công."); return(ar); }
public ApiResult <RollCallReponseModel> RollCall(RollCallModel model) { var r = new ApiResult <RollCallReponseModel>(); r.Data = new RollCallReponseModel(); r.Data.Base64Image = model.Base64Image; var rollCallData = new ApiResult <List <RollCall> >(); var classSchedule = RCSContext.ClassSchedules.Where(cs => cs.Id == model.ClassScheduleId).FirstOrDefault(); //check thông tin lớp học if (classSchedule == null) { r.Messages.Add("Lớp học không tồn tại."); return(r); } if (classSchedule.Status == (int)EClassStatus.Schedule) { r.Messages.Add("Lớp học chưa mở."); return(r); } if (classSchedule.Status == (int)EClassStatus.Closed) { r.Messages.Add("Lớp học đã kết thúc"); return(r); } var imageGray = model.Base64Image.base64ToImageGray(); var image = model.Base64Image.base64ToImage(); var bitmap = new Bitmap(image); var bitmapResponse = new Bitmap(bitmap); imageGray._EqualizeHist(); var rectangles = DetectService.DetectFaceRollCall(imageGray); if (rectangles.Count() == 0) { r.Messages.Add("Không có sinh viên nào trong ảnh."); return(r); } var classId = RCSContext.ClassSchedules.Where(cs => cs.Id == model.ClassScheduleId).FirstOrDefault().ClassId; var studyings = RCSContext.Studyings.Where(st => st.ClassId == classId).ToList(); var newRollCalls = new List <RollCall>(); var oldRollCalls = new List <RollCall>(); //Detect khuôn mặt rectangles.ForEach(rec => { var face = bitmap.cropAtRect(rec); var faceGray = new Image <Gray, byte>(face); var studentId = DetectService.RecognizeFace(faceGray); if (studentId == -1) { var faceGrayFlip = faceGray.Flip(FlipType.Horizontal); studentId = DetectService.RecognizeFace(faceGrayFlip); } if (studentId != -1) { if (studyings.Any(st => st.StudentId == studentId)) { bitmapResponse = drawFaceAndNoteOnBitmap(bitmapResponse, rec, studentId.ToString(), Color.Green); var rc = RCSContext.RollCalls.Where(i => i.StudentId == studentId && i.ClassScheduleId == model.ClassScheduleId).FirstOrDefault(); var fileData = new FileData { Data = face.bitmapToByteArr(), }; var fileAttachment = new FileAttachment { CreateDate = DateTime.Now, Height = face.Height, Width = face.Width, Extension = "jpg", Type = (int)EFileType.ImageJPG, Name = Guid.NewGuid().ToString(), FileData = fileData }; if (rc == null) { var rollCall = new RollCall(); rollCall = new RollCall { ClassScheduleId = model.ClassScheduleId, StudentId = studentId, CreatedDate = DateTime.Now, Type = (int)ERollCallType.Auto, IsActive = true }; newRollCalls.Add(rollCall); } else { rc.IsActive = true; rc.CreatedDate = DateTime.Now; rc.FileAttachment = fileAttachment; oldRollCalls.Add(rc); } } } else { bitmapResponse = drawFaceAndNoteOnBitmap(bitmapResponse, rec, "unknown", Color.Red); } }); if (newRollCalls.Count == 0 && oldRollCalls.Count == 0) { r.Messages.Add("Các sinh viên không thuộc lớp này."); r.Data.Base64Image = Convert.ToBase64String(bitmapResponse.bitmapToByteArr()); return(r); } RCSContext.RollCalls.AddRange(newRollCalls); try { RCSContext.SaveChanges(); } catch (Exception e) { r.Messages.Add(e.Message); return(r); } newRollCalls.AddRange(oldRollCalls); newRollCalls.ForEach(i => { i.ClassSchedule.RollCalls = null; i.FileAttachment = null; i.Student = null; i.Image = null; }); r.Messages.Add("Điểm danh thành công."); r.IsSuccess = true; r.Data.Base64Image = Convert.ToBase64String(bitmapResponse.bitmapToByteArr()); r.Data.RollCalls = newRollCalls; return(r); }
public ApiResult <TrainFaceModel> TrainStudentFace(TrainFaceModel model) { var ar = new ApiResult <TrainFaceModel>(); var student = RCSContext.Students.Where(s => s.Id == model.StudentId).FirstOrDefault(); if (student == null) { ar.IsSuccess = false; ar.Messages.Add("Sinh viên không tồn tại."); } else { var image = model.Base64Image.base64ToImage(); var bitmap = new Bitmap(image); var imageGray = model.Base64Image.base64ToImageGray(); imageGray._EqualizeHist(); var rectangles = DetectService.DetectFaceTrain(imageGray); if (rectangles.Count() <= 0) { ar.IsSuccess = false; ar.Messages.Add("Không nhận diện được khuôn mặt, vui lòng chọn nơi có ánh sáng đầy đủ và điều chỉnh hướng nhìn."); var data = new TrainFaceModel() { Base64Image = Convert.ToBase64String(bitmap.bitmapToByteArr()) }; ar.Data = data; } else if (rectangles.Count() == 1) { var trainImage = saveImageTraining(model.StudentId, model.Base64Image, rectangles[0]); var trainModels = new List <TrainModel>(); trainModels.Add(new TrainModel { StudentId = trainImage.StudentId, ImageId = trainImage.FileId, ImageGray = trainImage.FileAttachment.FileData.Data.byteArrToImageGray(), }); DetectService.AddTrainModels(trainModels); trainImage.FileAttachment.TrainingImages = null; trainImage.FileAttachment.FileData.FileAttachment = null; trainImage.Student = null; var data = new TrainFaceModel() { Base64Image = Convert.ToBase64String(drawFaceAndNoteOnBitmap(bitmap, rectangles[0], "", Color.Green).bitmapToByteArr()), StudentId = trainImage.StudentId, FileId = trainImage.FileId }; ar.Data = data; ar.IsSuccess = true; ar.Messages.Add("Training thành công."); } else { rectangles.ForEach(r => { bitmap = drawFaceAndNoteOnBitmap(bitmap, r, "", Color.Red); }); var data = new TrainFaceModel() { Base64Image = Convert.ToBase64String(bitmap.bitmapToByteArr()) }; ar.Data = data; ar.IsSuccess = false; ar.Messages.Add("Ảnh training chỉ được có một khuôn mặt."); } } return(ar); }
public BaseSevice() { RCSContext = new RCSContext(); DetectService = DetectService.Instance; md5Hash = MD5.Create(); }