Ejemplo n.º 1
0
 public RCSService() : base()
 {
     if (!isFirstTrained)
     {
         var trainModels = getAllTrainModel();
         if (trainModels.Count > 0)
         {
             DetectService.AddTrainModels(trainModels);
             isFirstTrained = true;
         }
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 public BaseSevice()
 {
     RCSContext    = new RCSContext();
     DetectService = DetectService.Instance;
     md5Hash       = MD5.Create();
 }