使用多线程c#进行帧缓冲管理

时间:2015-07-04 09:39:19

标签: c# multithreading

我想处理视频帧,但每帧处理会降低帧速率。 然后我决定缓冲帧并处理线程上的每一帧。我将每个帧放在input队列中,并在thrds队列中按detection函数处理它们,最后将处理后的帧放在output队列中。

我的问题是当我的程序运行时,每5帧(5个缓冲区的大小)显示具有良好的帧速率但在此5帧之后程序停止了一秒并显示5个下一帧好! 我使用emguCV来捕获视频。 管理线程我使用这个类:

 class Manage_buffer
    {

        public Queue<Bitmap> Input;
        public Queue<Bitmap> Output;
        public Queue<Thread> thrds;
        FaceDetectionDll.Class1 fdclass;

        public Manage_buffer()
        {

            Input = new System.Collections.Generic.Queue<Bitmap>();
            Output = new System.Collections.Generic.Queue<Bitmap>();
            thrds = new System.Collections.Generic.Queue<Thread>();
            fdclass = new FaceDetectionDll.Class1();

        }

        public void Add(Bitmap bmp)
        {

            lock (Input)
            {

                Bitmap n = new Bitmap(bmp);
                Input.Enqueue(n);
            }

            Thread thrd = new Thread(new ThreadStart(detection));
            thrd.IsBackground = true;       
            thrds.Enqueue(thrd);

            if (Input.Count > 4)
            {
               Parallel.Invoke(tstar);
            }

        }

        void tstar()
        {
            while (thrds.Count > 0)
            {
                Thread t = thrds.Dequeue();
                t.Start();
            }

        }



        void detection()
        {
            Bitmap b = new Bitmap(1, 1);   
            lock (Input)
            {   
                if (Input.Count > 0)
                {    
                    Bitmap bp = new Bitmap(Input.Dequeue());    
                    Image<Rgb, Byte> currentFrame = new Image<Rgb, Byte>(bp);                 
                    fdclass.FaceDetectionFunc((int)currentFrame.Ptr);
                    b = new Bitmap(currentFrame.ToBitmap());
                    bp.Dispose();
                    currentFrame.Dispose();
                }
            }
            Output.Enqueue(b);
        }
    }

表格窗口中的主要代码是:

....
mgclass=new Manage_buffer();
Application.Idle += ProcessFrame;
.....
 private void ProcessFrame(object sender, EventArgs arg)
        {
            Image<Bgr, Byte> ImageFrame = c.QueryFrame();  //line 1
            Bitmap frame = ImageFrame.ToBitmap();
                   mgclass.Add(frame);
                   if (mgclass.Output.Count > 0)
                   {
                       frame = mgclass.Output.Dequeue();
                       pictureBox1.Image = frame;  
                   }       
                Thread.Sleep((int)(1000.0 / 25));//frame rate of vide is 25fps
        }

0 个答案:

没有答案