我正在使用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设置宽度,高度我获得了非常好的性能...
我的问题如何才能获得良好的表现......
答案 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,除非您支付更高的帧速率类型。
希望这有帮助,
干杯,
克里斯