Emgu/OpenCV:VideoCapture.QueryFrame() 的事件已结束。

Emgu/OpenCV: Event for VideoCapture.QueryFrame() finished.

下面是我的代码的基本思路:

    private void CaptureCameraFrame()
    {
        Capture = new VideoCapture();
        CameraModel.Instance.CameraViewMat = Capture.QueryFrame();

        // do stuff with queried matrix here

        if(noAbortCondition)
        {
            CaptureCameraFrame();
        }
    }

该方法应该 运行 在一个单独的线程中使用处理后的当前图像更新我的 GUI。 唯一的问题是,我遇到了两种不同的错误:

  1. 尝试 read/write 受保护的内存:这发生在第二次 运行 到 方法。
  2. 我在查询帧后立即使用 `CameraModel.Instance.CameraViewMat 得到空引用错误。

这两个问题似乎是相关的,似乎 QueryFrame() 运行 与其余代码异步,并且在程序跳转到下一步时未完成。 问题是:如何确定从相机中查询图像已经完成,我可以使用矩阵中的信息并开始新的查询?

在所有示例中,我发现这是通过使用时间完成的,但我想在处理完最后一帧后立即开始一个新帧。

关于线程,我在 C# 中并没有真正做太多,但我理解在这种情况下人们会使用 asyncawait 关键字来确保一个方法在一个异步方法完成。但是,在这种情况下我无法进行有效的实施。

您正在重复创建 VideoCapture class 实例,甚至没有处理它。仅创建一次 VideoCapture 实例并将它们用于您的任务。最后处理一下。

public YourConstructor()
{
    Capture = new VideoCapture();
}
private void CaptureCameraFrame()
{
    CameraModel.Instance.CameraViewMat = Capture.QueryFrame();

    // do stuff with queried matrix here

    if(noAbortCondition)
    {
        CaptureCameraFrame();
    }
}

希望它对你有用!