C# Emgu/OpenCV:VideoCapture.QueryFrame()的事件已完成。
以下是我的代码的基本思想:C# Emgu/OpenCV:VideoCapture.QueryFrame()的事件已完成。,c#,opencv,emgucv,C#,Opencv,Emgucv,以下是我的代码的基本思想: private void CaptureCameraFrame() { Capture = new VideoCapture(); CameraModel.Instance.CameraViewMat = Capture.QueryFrame(); // do stuff with queried matrix here if(noAbortCondition) {
private void CaptureCameraFrame()
{
Capture = new VideoCapture();
CameraModel.Instance.CameraViewMat = Capture.QueryFrame();
// do stuff with queried matrix here
if(noAbortCondition)
{
CaptureCameraFrame();
}
}
该方法应该在单独的线程中运行,在处理后使用当前图像更新我的GUI。
唯一的问题是,我得到两种不同类型的错误:
QueryFrame()
从代码的其余部分异步运行,并且在程序跳到下一步时没有完成。
问题是:我如何确保从相机查询图像的工作已经完成,并且我可以使用矩阵中的信息以及启动新的查询
在所有的例子中,我发现这是通过使用时间来完成的,但我希望在最后一帧上的处理完成后尽快从一个新帧开始
在C#中,当涉及到线程时,我并没有做太多工作,但我所理解的是,在这种情况下,人们会使用
async
和wait
关键字来确保异步方法中的方法完成。然而,在这种情况下,我无法进行有效的实现 您正在重复创建VideoCapture
类实例,甚至没有处理它。只创建一次您的VideoCapture
实例,并将其用于您的任务。最后处理它
public YourConstructor()
{
Capture = new VideoCapture();
}
private void CaptureCameraFrame()
{
CameraModel.Instance.CameraViewMat = Capture.QueryFrame();
// do stuff with queried matrix here
if(noAbortCondition)
{
CaptureCameraFrame();
}
}
希望它能为你工作 要补充的一点是:如果我删除递归,我会设法捕获一个静态图像。所以从这方面来说,一切都应该很好。Thx,这肯定有帮助。现在我只需要弄清楚如何将该方法放到另一个任务中,因为我在这里也得到了一个关于受保护内存的异常。可能这与线程/任务的访问权限有关…编辑:发现线程问题:不应尝试从新任务更新属于GUI线程的变量^0无法直接从外部线程访问GUI,可以使用此.invoke()从外部线程调用GUI线程上与GUI相关的代码。看这个。非常感谢您提供的帮助!