コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
 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);
     }
 }
コード例 #6
0
        /// <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;
            }
        }
コード例 #7
0
 /// <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("样本保存失败。");
     }
 }
コード例 #8
0
 private void SampleBox_Click(object sender, EventArgs e)
 {
     _currentfdo      = _recognizeHelper.GetFaceRectangle(_videoCapture.QueryFrame());
     _currentFaceFlag = 0;
     getCurrentFaceSample(0);
 }
コード例 #9
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);
            }
        }
コード例 #10
0
 private void CollectionSample_Click(object sender, RoutedEventArgs e)
 {
     currentfdo = _faceTools.GetFaceRectangle(currentFrame);
     GetCurrentFaceSample(currentFrame);
 }