我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
然后我做一些操作,如跟踪对象,但它有非常糟糕的性能,我的意思是每200毫秒,我删除线条5,6设置宽度,高度我得到非常好的性能...
我的问题我怎样才能获得良好的表现......
不建议使用计时器从网络摄像头获取图像,因为它会导致性能降低.当程序执行很少时(即不处理帧),获取帧会好得多.查看代码示例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;
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您不仅可以了解计时器的运行速度,还可以了解您的程序正在执行的操作以及相机在分辨率下获取帧的速度.由于它是一个相当高的res类型(720p),我预计15 FPS,除非你支付更高的帧速率类型.
希望这可以帮助,
干杯,
克里斯