查询高分辨率帧时,EmguCV性能非常差

时间:2011-11-09 20:05:00

标签: c# opencv emgucv

我正在使用EmguCV按照我定义的捕获顺序查询帧:

Capture cap;
private void Form1_Load(object sender, EventArgs e)
{
    cap = new Capture();
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 1280);
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 720);
    timer1.Interval = 20;
    timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
    Image<Bgr, byte> img = cap.QueryFrame();
    pictureBox1.Image = img.Bitmap;
}

然后我做了一些操作,比如跟踪对象,但它的性能非常糟糕我的意思是每隔约200毫秒我在删除线条时获得新的帧5,6设置宽度,高度我获得了非常好的性能...

我的问题如何才能获得良好的表现......

1 个答案:

答案 0 :(得分:5)

不建议使用计时器从网络摄像头获取图像,因为它会导致性能降低。当程序执行很少,即不处理帧时,获取帧会好得多。查看代码示例CameraCaptue以供参考,但您的代码看起来应该是这样的。

Capture cap;
private void Form1_Load(object sender, EventArgs e)
{
    cap = new Capture();
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 1280);
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 720);
    Application.Idle += ProcessFrame;
}
private void ProcessFrame(object sender, EventArgs arg)
{
    Image<Bgr, Byte> frame = _capture.QueryFrame();
    pictureBox1.Image = img.Bitmap;
}

使用此方法,您不仅限于计时器的运行速度,还包括您的程序正在执行的操作以及相机在分辨率下获取帧的速度。由于它是一个相当高的分辨率类型(720p),我预计15 FPS,除非您支付更高的帧速率类型。

希望这有帮助,

干杯,

克里斯