/// <summary> /// 实时识别 /// </summary> /// <param name="source"></param> /// <param name="e"></param> private void OnTimedEvent(object source, ElapsedEventArgs e) { try { Console.WriteLine(capture.Grab()); System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(140, 50, 400, 430); Mat showMat = new Mat(capture.QueryFrame(), rectangle); FaceDetectedObj faceDetectedObj = _faceTools.FaceRecognize(showMat); originImage.Image = _faceTools.FaceRecognize(showMat).originalImg; if (faceDetectedObj.Name != null) { this.Dispatcher.BeginInvoke(new Action(() => { infoShow.Text = "姓名为:" + faceDetectedObj.Name; })); } if (capture != null && capture.Grab()) { } } catch (Exception ex) { Console.WriteLine("***" + ex.Message); } }
/// <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, 3), 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(); string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); Font font = new Font("宋体", 20, 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); fdo.Name = name; fdo.names.Add(name); #endregion } } #endregion return(fdo); }
/// <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, 1, new Size(100, 100)); faces.AddRange(facesDetected); } } catch (Exception ex) { } fdo.facesRectangle = faces; return(fdo); }
private void timer_Tick(object sender, EventArgs e) { try { if (_videoCapture == null) { _videoCapture = new VideoCapture(); _videoCapture.ImageGrabbed += frameProcess; //实时获取图像 _videoCapture.Start(); } Monitor.Enter(_videoCapture); Mat mat = _videoCapture.QueryFrame(); Monitor.Exit(_videoCapture); if (!mat.IsEmpty) { FaceDetectedObj faceobj = _recognizeHelper.faceRecognize(mat); if (!faceobj.originalImg.IsEmpty) { picShow.Image = faceobj.originalImg.Bitmap; } } } catch (Exception ex) { //throw ex; //_videoCapture.Stop(); //_videoCapture.Dispose(); } }
private void GetCurrentFaceSample(Mat showMat) { try { currentfdo = _faceTools.GetFaceRectangle(showMat); if (currentfdo.originalImg != null) { Mat grayMat = new Mat(); grayMat = currentfdo.originalImg.Clone(_faceTools._faceSample); Cv2.Resize(grayMat, grayMat, new OpenCvSharp.Size(100, 100)); Cv2.CvtColor(grayMat, grayMat, ColorConversionCodes.BGR2GRAY); Cv2.EqualizeHist(grayMat, grayMat);//均衡化灰度图片 sampleImage.Image = _faceTools.byteToImage(grayMat.ToBytes()); string fileName = _userInfo.Name + "_" + Guid.NewGuid().ToString() + ".jpg"; string path = System.IO.Path.Combine(faceSamplesPath, fileName); Thread.Sleep(100); sampleImage.Image.Save(path); MessageBox.Show("样本保存完毕"); } else { this.Dispatcher.BeginInvoke(new Action(() => { infoShow.Text = "采样失败,没有检测到人脸"; })); } } catch (Exception ex) { MessageBox.Show("采样时发生异常,信息:" + ex.Message); } }
/// <summary> /// 人脸识别 /// </summary> /// <param name="emguImage"></param> /// <returns></returns> public FaceDetectedObj faceRecognize(Mat emguImage) { try { 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 = _trainedFaceRecognizer.faceRecognizer.Predict(grayFace); int label = pr.Label; if (label < 0) { continue; } string recogniseName = _trainedFaceRecognizer.trainedFileList.trainedFileName[pr.Label].ToString(); string name = _trainedFaceRecognizer.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); if (_nameCahce != name) { _nameCahce = name; SpeechSynthesizer synth = new SpeechSynthesizer(); synth.SetOutputToDefaultAudioDevice(); synth.SpeakAsync("欢迎您" + name); } #endregion fdo.names.Add(name); } } #endregion return(fdo); } catch (Exception ex) { throw ex; } }
/// <summary> /// 采样 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CollectionSample_Click(object sender, RoutedEventArgs e) { try { System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(140, 50, 400, 430); Mat showMat = new Mat(capture.QueryFrame(), rectangle); currentfdo = _faceTools.GetFaceRectangle(showMat); getCurrentFaceSample(0); string filePath = _faceTools.FaceSamplesPath + "\\" + _userInfo.Name.ToString() + "_" + System.Guid.NewGuid().ToString() + ".jpg"; sampleImage.Image.Save(filePath); MessageBox.Show("样本保存完毕。"); } catch (Exception ex) { MessageBox.Show("样本保存失败。"); } }
private void SampleBox_Click(object sender, EventArgs e) { _currentfdo = _recognizeHelper.GetFaceRectangle(_videoCapture.QueryFrame()); _currentFaceFlag = 0; getCurrentFaceSample(0); }
private void StartCamera_Click(object sender, RoutedEventArgs e) { try { if (IsRunning) { // 关闭人脸检测 CloseCapture(); IsRunning = false; } else { // 开启人脸检测 _capture = new VideoCapture(0); ShouldStop = false; WakeupResetEvent.Reset(); if (ThreadPool.QueueUserWorkItem(new WaitCallback((state) => { try { //此前Demo中可以正确获取到Fps,后来再重新建项目时一直获取到的值为0。 Why??? //int millisecondsTimeout = (int)Math.Round(1000.0 / Capture.Fps); // 计算间隔 int millisecondsTimeout = (int)Math.Round(1000.0 / 30); // 计算间隔 Console.WriteLine(_capture.Fps); while (true) { if (ShouldStop) { break; // 是否停止人脸检测 } // 获取图像帧 Mat Bgr = new Mat(); if (_capture.Read(Bgr)) { if (!Bgr.Empty()) { OpenCvSharp.Rect rectangleRoi = new OpenCvSharp.Rect(140, 50, 400, 430); Bgr = new Mat(Bgr, rectangleRoi); currentFrame = Bgr; //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); FaceDetectedObj faceObject = _faceTools.FaceRecognize(Bgr); //stopwatch.Stop(); //Console.WriteLine("耗时:{0}s", stopwatch.ElapsedMilliseconds / 1000); originImage.Image = _faceTools.byteToImage(Bgr.ToBytes()); } } // 是否停止等待下一帧 if (WakeupResetEvent.WaitOne(millisecondsTimeout)) { break; } } } catch (Exception ex) { Console.WriteLine("读取实时视频时发生异常,信息:" + ex.Message); } }))) { IsRunning = true; } else { // 启动人脸检测线程失败 ShouldStop = true; WakeupResetEvent.Set(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void CollectionSample_Click(object sender, RoutedEventArgs e) { currentfdo = _faceTools.GetFaceRectangle(currentFrame); GetCurrentFaceSample(currentFrame); }