线程减慢直播相机操作

时间:2014-02-24 05:35:57

标签: c# multithreading thread-safety

我正在开展一个项目,我已经实施了线程来处理相机捕获的图像。

请找一段时间间隔后计时器调用的ProcessFrame()代码。

    private void ProcessFrame()
 {            
            try
            {
                 Image<Bgr, Byte> ImageFrame;
                // Get Image from the camera
                ImageFrame = capture.QueryFrame();

              // check if imageFrame is null or not 
                if (ImageFrame == null)
                {
     // if null then re- initialize  the camera
                    try
                    {
                        capture.Dispose();
                        capture = new Capture(URL);                   
                        ImageFrame = capture.QueryFrame();                   
                    }
                    catch (Exception ex)
                    {

                    }
                }
               // resize image to show on Picture control
                ImageFrame = ImageFrame.Resize(img.Width, img.Height, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);
    // show image on picture control
                img.Image = ImageFrame;
                try
                {   
     #region Making directory and image in this code
                    string VerifyImageFolderId = VerifyImageFolder + "\\" + "Camera_" + (1) + "\\";

                    if (!Directory.Exists(VerifyImageFolderId))
                        Directory.CreateDirectory(VerifyImageFolderId);

                    string VerifyImageFileName = VerifyImageFolderId + "\\" + nSavedImagesCounter + ".jpg";
                    img.Image.Save(VerifyImageFileName); // Save Image
                    nSavedImagesCounter++;
                    #endregion

                    #region Starting thread For processing Image
                     Thread processImage = new Thread(new ThreadStart(() => ProcessImage(VerifyImageFileName)));
                      processImage.Start();                    
                    #endregion

                }
                catch (Exception ex)
                {
                    Log(ex.Message);
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    GC.Collect();
                }
                //#endregion
            }
            catch (NullReferenceException e)
            {
                Console.Write("Exception:\n" + DateTime.Now.ToString("hhmmss"));
            }

        }

这里是第二个函数ProcessImage(string ImagePath),它用于执行一些文件处理操作,如下所示:

 private void ProcessImage(string ImagePath)
    {            
        #region Check for threadSafeFunction
        if (this.InvokeRequired)
        {
            Console.WriteLine("Inside InvokeRequired");
            this.Invoke(new MethodInvoker(delegate() { ProcessImage(ImagePath); }));
        }
        else
        {
1. Detect faces in Image 
    2. Draw Face markers on Image
    3. Some database based on result of Face Detection
    4. Delete image File            
        }

    }

添加ProcessFrame()功能的线程后,功能变慢了。 而且我无法显示直播。

任何人都可以帮我吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我建议您使用队列处理图像 运行此代码一次

     BlockingCollection<string> imageQueue=new BlockingCollection<string>();
        new Thread(() =>
        {
            foreach (string imagePath in imageQueue.GetConsumingEnumerable())
            {
                ProcessImage(imagePath);
            }
        }).Start();

并像这样更改ProcessFrame

 private void ProcessFrame()
 {


        .....

                #region Starting thread For processing Image
                imageQueue.Add(VerifyImageFileName);
                #endregion

            ...

    }