编程语言
首页 > 编程语言> > C#QueryFrame中的EmguCV 2.3.0返回先前查询的框架

C#QueryFrame中的EmguCV 2.3.0返回先前查询的框架

作者:互联网

我正在使用EmguCV 2.3.0,并从Capture随机查询帧以将其保存到硬盘.问题是当我调用Capture.QueryFrame()或Capture.QuerySmallFrame()时,它会延迟一帧.
为了使这一点更清楚:我启动程序并查询指向我的脸的框架.我的脸出现在.jpeg中.然后,我将相机对准我的脸并查询另一帧,然后我的脸再次出现在.jpeg中.然后,我再次将其指向我的脸,查询一个框架,.jpeg包含指向远离我的脸的图像.
查询中似乎存在1帧延迟.是否有一些底层缓冲区?是什么原因造成的?最重要的是:如何在不查询单个捕获图像的多个帧的情况下解决此问题?

我的另一个问题是,当我将网络摄像头分辨率设置为1600×1200时,程序和计算机开始滞后-即使不使用图像或查询帧也是如此.那是因为我创建一个Capture并将其保存在内存中引起的吗?有没有办法减轻这种影响?

注意:此解决方案不足以快速获取帧,这里的问题继续:
System.TypeInitializationException using Emgu.CV in C#

解决方法:

好吧,您的问题是您不处置旧的捕获,因此当您发送另一个捕获时,它将始终返回旧的捕获然后再获取另一个.从网络摄像机示例调整的以下代码应该可以解决问题.

_capture = new Capture();
Image<Bgr, Byte> frame = _capture.QueryFrame();

Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>();
Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown();
Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp();
Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60));

captureImageBox.Image = frame;
grayscaleImageBox.Image = grayFrame;
smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
cannyImageBox.Image = cannyFrame;
_capture.Dispose();

它是_capture.Dispose();这很重要.

至于1600×1200,是的,这是正确的,因为您的内存中有大量数据.首先从有效地“使用”内存流开始,并在完成时处置它.这是通过“ using”语句完成的,该语句在开始时自动创建对象,并在末尾调用其.Dispose函数,只是您不必这样做.请注意复制过程,否则将传递一个指针,并且当退出使用代码时,也将处理框架.使用图像时,还应该练习“ using”语句.但是上面的代码现在看起来像这样:

Image<Bgr, Byte> frame;
using (Capture capture = new Capture())
{
    frame = capture1.QueryFrame().Copy(); //You must copy else frame will be disposed off
}
Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>();
Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown();
Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp();
Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60));

grayscaleImageBox.Image = grayFrame;
smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
cannyImageBox.Image = cannyFrame;

其次,您可以使用.Resize(scale,Interpolation Method)调整捕获图像的大小.大图像通常是使用专用的图像采集卡从相机传递的,因此显然避免了系统依赖性,而高清USB网络摄像头则不再如此.

您可以像这样调整输入图像的大小,并通过有效的“使用”语句来调整最终代码,如下所示:

Image<Bgr, Byte> frame;
using (Capture capture1 = new Capture())
{
    frame = capture1.QueryFrame().Resize(0.5, Emgu.CV.CvEnum.INTER.CV_INTER_AREA).Copy();
    captureImageBox.Image = frame;
}

using (Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>())
{
    grayscaleImageBox.Image = grayFrame;
    using (Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown())
    {
        using (Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp())
        {
            smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
            using (Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60)))
            {
                cannyImageBox.Image = cannyFrame;
            }
        }
    }
}

干杯
克里斯

标签:emgucv,opencv,c
来源: https://codeday.me/bug/20191207/2087491.html