我正在使用EmguCV进行一个项目,该项目需要从相机捕获图像并处理它们,在图像中查找某些内容。处理大约需要0.2秒,并且是应用程序中最大的时间接收器,因此我们正在研究捕获/处理不同的线程以加速整个过程。
我们已经尝试过VideoCapture.ImageGrabbed事件处理程序,并调用Retrieve,以及设置我们自己的调用QueryFrame和我们可以找到的任何其他捕获方法的线程循环。
大多数线程解决方案最终会导致空图像(由于某种原因,没有被Mat的.IsEmpty属性捕获),最终会以0字节保存图像。
在此之后,我们尝试简化,但由于库内部的缓冲区,因此遇到了相机总是落后几秒的问题。这引出了我的问题:有没有办法刷新缓冲区或清除内存?由于创建对象的时间开销,我们无法处置捕获对象。关于线程捕获和处理的任何提示也是受欢迎的,尽管我在本网站上发现的有关类似情况的其他建议并没有取得多大成功。
我们正在使用的代码的简短示例
_capture.ImageGrabbed += GrabFrames;
...
public void GrabFrames()
{
Mat image = new Mat();
_capture.Retrieve(image);
ProcessThread = new Thread(new ParameterizedThreadStart(StartProcess));
ProcessThread.Start(image);
}
...
public void StartProcess(object image)
{
Mat img = (Mat)image;
Process(image);
img.Dispose();
}