我想处理视频帧,但每帧处理会降低帧速率。
然后我决定缓冲帧并处理线程上的每一帧。我将每个帧放在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
}