/// <summary> /// 获取制定图片,识别出的人脸矩形框 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public faceDetectedObj GetFaceRectangle(Mat emguImage) { faceDetectedObj fdo = new faceDetectedObj(); fdo.originalImg = emguImage; List <Rectangle> faces = new List <Rectangle>(); try { using (UMat ugray = new UMat()) { CvInvoke.CvtColor(emguImage, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); //灰度化图片 CvInvoke.EqualizeHist(ugray, ugray); //均衡化灰度图片 Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, 10, new Size(20, 20)); faces.AddRange(facesDetected); } } catch (Exception ex) { } fdo.facesRectangle = faces; return(fdo); }
/// <summary> /// 人脸识别 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public faceDetectedObj faceRecognize(Mat emguImage) { faceDetectedObj fdo = GetFaceRectangle(emguImage); Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>(); #region 给识别出的所有人脸画矩形框 using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { foreach (Rectangle face in fdo.facesRectangle) { g.DrawRectangle(new Pen(Color.Red, 2), face); //给识别出的人脸画矩形框 Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist(); //得到均衡化人脸的灰度图像 #region 得到匹配姓名,并画出 Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace); string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); Font font = new Font("宋体", 16, GraphicsUnit.Pixel); SolidBrush fontLine = new SolidBrush(Color.Yellow); float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2); float yPos = face.Y - 21; g.DrawString(name, font, fontLine, xPos, yPos); #endregion fdo.names.Add(name); } } #endregion return(fdo); }
/// <summary> /// 人脸识别 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public faceDetectedObj faceRecognize(Mat emguImage) { faceDetectedObj fdo = GetFaceRectangle(emguImage); Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>(); #region 给识别出的所有人脸画矩形框 using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { foreach (Rectangle face in fdo.facesRectangle) { Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像 #region 得到匹配姓名 Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace); string name = ""; //Distance越小表示 越可能是同一个人 if (pr.Distance < 4000) { name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); } #endregion fdo.names.Add(name); } } #endregion return(fdo); }
/// <summary> /// 人脸识别 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public faceDetectedObj faceRecognize(Mat emguImage) { faceDetectedObj fdo = GetFaceRectangle(emguImage); Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>(); #region 给识别出的所有人脸画矩形框 using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { foreach (Rectangle face in fdo.facesRectangle) { g.DrawRectangle(new Pen(Color.Red, 2), face);//给识别出的人脸画矩形框 Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像 //Mat pMat = new Mat(); //float[] ranges = new float[] { 0.0f, 256.0f }; //using (Emgu.CV.Util.VectorOfMat vm = new Emgu.CV.Util.VectorOfMat()) //{ // vm.Push(GrayFace); // CvInvoke.CalcHist(vm, new int[] { 0 }, null, pMat, new int[] { 1 }, ranges, false); //} #region 得到匹配姓名,并画出 Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace); System.Diagnostics.Debug.WriteLine(pr.Distance + " " + pr.Label); string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); Font font = new Font("宋体", 16, GraphicsUnit.Pixel); SolidBrush fontLine = new SolidBrush(Color.Yellow); float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2); float yPos = face.Y - 21; g.DrawString(name, font, fontLine, xPos, yPos); #endregion fdo.names.Add(name); } } GC.Collect(); #endregion return(fdo); }
/// <summary> /// 人脸识别 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public faceDetectedObj faceRecognize(Mat emguImage) { //tfr = new TrainedFaceRecognizer(); //tfr.trainedFileList = SetSampleFacesList(); //tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 100); faceDetectedObj fdo = GetFaceRectangle(emguImage); Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>(); #region 给识别出的所有人脸画矩形框 using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { foreach (Rectangle face in fdo.facesRectangle) { g.DrawRectangle(new Pen(Color.Red, 2), face); Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像 #region 得到匹配姓名 //tfr.faceRecognizer.Load("test.xml"); Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace); string name = ""; //Distance越小表示 越可能是同一个人 //if (pr.Distance < 4000) //{ name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); // } Font font = new Font("宋体", 16, GraphicsUnit.Pixel); SolidBrush fontLine = new SolidBrush(Color.Yellow); float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2); float yPos = face.Y - 21; g.DrawString(name, font, fontLine, xPos, yPos); #endregion fdo.names.Add(name); } } GC.Collect(); #endregion return(fdo); }