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。 唯一的问题是,我得到两种不同类型的错误:

  • 尝试读取/写入受保护内存:这发生在第二次运行时 对方法的改进
  • 我在查询帧后立即使用`CameraModel.Instance.CameraViewMat'得到一个空引用错误 这两个问题似乎是相互关联的,就像
    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相关的代码。看这个。非常感谢您提供的帮助!