gpt4 book ai didi

c# - EmguCV/OpenCV QueryFrame 缓慢/缓冲

转载 作者:太空宇宙 更新时间:2023-11-03 21:38:50 25 4
gpt4 key购买 nike

我们有一个应用程序,我们从外部系统获取消息,然后拍照,进行一些处理并将某些内容返回给外部系统。在做一些性能测试时,我发现了两个问题(它们有些相关)。我希望有人能够向我解释这一点。

1) _capture.QueryFrame()缓冲帧?我们看到的是,如果来自网络摄像头的两帧查询之间存在间隙,则第二帧通常是一张较旧的图片,而不是调用 queryFrame 时的图片。

我们能够通过丢弃一些帧在某种程度上缓解这个问题,即调用 _capture.QueryFrame() 2-3次并丢弃结果。

2) 第二个问题是当我们对应用程序的不同部分进行计时时,我们发现清除缓冲区(调用 QueryFrame() 2-3 次并且不使用结果)大约需要 65 毫秒,然后这一行:Image<Bgr, Byte> source = _capture.QueryFrame()大约需要 80 毫秒。这两个部分占用的处理时间最多,我们的实际处理时间大约多出 20-30 毫秒。

是否有更快的方法 (a) 清除缓冲区 (b) 以捕获帧?

如果您有使用 OpenCV 的经验并了解相关内容,请告诉我。

最佳答案

我回答过类似的问题System.TypeInitializationException using Emgu.CV in C#在测试了获取最新框架的各种可能性后,我发现了下面的 bes 方法。

1) 是的,当您从网络摄像头设置捕获时,会创建一个环形缓冲区来存储图像,这样可以有效分配内存。

2) 是的,有一个更快的方法,全局设置您的捕获设备并设置它记录和调用 ProcessFrame 以尽可能从缓冲区获取图像。现在只需更改您的 QueryFrame 即可复制其刚刚获取的任何帧。这有望解决您获取前一帧的问题,您现在将从缓冲区中取出最新的帧。

private Capture cap;
Image<Bgr, Byte> frame;

public CameraCapture()
{
InitializeComponent();
cap= new Capture();
cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height);
cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width);

Application.Idle += ProcessFrame;
}

private void ProcessFrame(object sender, EventArgs arg)
{
frame = _capture.QueryFrame();
grayFrame = frame.Convert<Gray, Byte>();
}

public Image<Bgr,byte> QueryFrame()
{
return frame.Copy();
}

如果不让我知道,我希望这对您有所帮助,我会尝试根据您的要求定制解决方案。不要忘记,您始终可以在不同的线程上运行采集并调用新的 QueryFrame 方法。

干杯

克里斯

关于c# - EmguCV/OpenCV QueryFrame 缓慢/缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com