【问题标题】:Emgu/OpenCV: Event for VideoCapture.QueryFrame() finished.Emgu/OpenCV:VideoCapture.QueryFrame() 的事件已完成。
【发布时间】:2019-02-28 20:53:19
【问题描述】:

这是我的代码的基本思想:

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

        // do stuff with queried matrix here

        if(noAbortCondition)
        {
            CaptureCameraFrame();
        }
    }

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

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

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

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

当谈到线程时,我在 C# 中并没有真正做太多事情,但据我所知,在这种情况下,人们会使用 asyncawaitkeywords 来确保异步方法中的方法完成。但是,在这种情况下,我无法进行有效的实施。

【问题讨论】:

  • 关于要添加的内容:如果我删除递归,我会设法捕获静态图像。所以从这方面来说,一切都应该正常。

标签: c# opencv emgucv


【解决方案1】:

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

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

    // do stuff with queried matrix here

    if(noAbortCondition)
    {
        CaptureCameraFrame();
    }
}

希望它对你有用!

【讨论】:

  • 谢谢,这绝对有帮助。现在我只需要弄清楚如何将该方法放入另一个任务中,因为我在这里也遇到了一个关于受保护内存的异常。也许这与线程/任务的访问权限有关......
  • 编辑:发现线程问题:不应该尝试从新任务中更新属于 GUI 线程的变量^^
  • 您不能直接从外部线程访问 GUI,您可以使用 this.Invoke() 从外部线程调用 GUI 线程上的 GUI 相关代码。
  • 非常感谢您提供的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多