Медленное видео по распознаванию и распознаванию лиц - PullRequest
0 голосов
/ 16 апреля 2019

Я использую EMGUCV для распознавания и распознавания лиц, используется версия «3.3.0», а IP-камера - пуля CP Plus.

Я могу выполнить обнаружение и распознавание, но живое видео при распознавании очень медленное, почти на 10-15 секунд позади реального потока. Не уверен, что это что-то с кодом.

Ниже приведен код, который я сделал до сих пор. Не уверен, как я могу ускорить процесс.

Form_Load()
{
    _videoCapture = new VideoCapture("rtsp://uname:pwd@19.18.1.40:554");
    Application.Idle += new EventHandler(FrameGrabber_Standard);
} 
private void FrameGrabber_Standard(object sender, EventArgs e)
        {
            try
            {
                Image<Bgr, Byte> currentFrame = _videoCapture.QueryFrame().ToImage<Bgr, Byte>().Resize(640, 480, Inter.Cubic);
                if (currentFrame != null)
                {
                    Image<Gray, byte> gray_frame = currentFrame.Convert<Gray, Byte>();
                    List<Rectangle> listFaces = new List<Rectangle>();
                    detectfacensobj.DetectFaces(currentFrame, listFaces); //the actual face detection happens here
                    foreach (Rectangle face in listFaces)
                    {
                        faceResult = currentFrame.Convert<Bgr, byte>();
                        if (Eigenfaces.IsTrained)
                        {
                            Image<Gray, byte> grayFaceResult = faceResult.Convert<Gray, byte>();
                            var result = Eigenfaces.eigenFaceRecognizer.Predict(grayFaceResult.Resize(200, 200, Inter.Cubic));
                            if (result.Label != -1)
                            {
                                CvInvoke.PutText(currentFrame, Eigenfaces.eigenlabels[result.Label], new System.Drawing.Point(face.X - 2, face.Y - 2), FontFace.HersheyComplex, 1.0, new Bgr(Color.Orange).MCvScalar);
                            }

                        }

                        currentFrame.Draw(face, new Bgr(Color.Red), 2);
                    }
                    captureImageBox.Image = currentFrame.Bitmap;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
public bool DetectFaces(IInputArray image, List<Rectangle> listfaces)
        {
            bool isDetect = false;

            try
            {
                using (UMat grayImage = new UMat())
                {
                    CvInvoke.CvtColor(image, grayImage, ColorConversion.Bgr2Gray);
                    CvInvoke.EqualizeHist(grayImage, grayImage);

                    Rectangle[] facesDetected = faceCascadeClass.DetectMultiScale(grayImage, 1.1, 3, new Size(20, 20));
                    if (facesDetected.Length == 0)
                    {
                        isDetect = false;
                    }
                    else
                    {
                        isDetect = true;
                        listfaces.AddRange(facesDetected);
                    }
                }

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Erro" + ex.Message);
            }
            return isDetect;
        }
```````````````````
...