Медленное видео при распознавании и распознавании лиц

#emgucv

#emgucv

Вопрос:

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

Я могу выполнять обнаружение и распознавание, но видео в реальном времени при распознавании очень медленное, почти на 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;
        }
```````````````````
  

Комментарии:

1. Как вы оцениваете тот факт, что вы так сильно отстаете? Я не вижу счетчика кадров. Вы работаете в режиме отладки или выпуска? Вы компилируете для x64, x86 или ANY_CPU? Я бы предложил x64, если у вас 64-разрядная ОС. Я бы поставил несколько секундомеров в стратегическом месте, чтобы получить некоторые фактические измерения времени, сколько времени занимает процесс. Я бы, конечно, отправлял какой-то оператор трассировки в файл журнала или консоль каждый раз, когда вызывается обработчик событий.

2. Достаточно ли у вас памяти, процессора и графического процессора, поскольку я вижу, что вы используете UMat. Нам нужна дополнительная информация, прежде чем кто-либо сможет вмешаться и помочь.

3. Спасибо за ответы. Я смотрю на видео в реальном времени, которое я показываю в приложении, и вот как я могу сказать, что оно медленное… Также, как вы предположили, это может быть и в том случае, когда я запускаю сборку debug / any_cpu. Я запущу его в сборке release / 64, чтобы увидеть, есть ли какая-либо разница. У меня довольно хороший ноутбук, 16 ГБ оперативной памяти.Графический процессор Nvidia K1100M.