【问题标题】:OpenCV Multi-Threaded Thread MessageOpenCV 多线程线程消息
【发布时间】:2010-12-11 08:12:02
【问题描述】:

我正在使用 .Net 3.5 和 OpenCV 1.1 编写程序。我有多个线程需要从计算机上的网络摄像头获取图像变量,问题是当多个线程尝试同时访问摄像头时出现内存冲突错误。我知道我可以使用 PostThreadMessage 和 GetMessage 将变量发送到线程。谁能给我一个教程或示例,说明如何在线程运行时使用PostThreadMessageGetMessage 将变量传递给它?

当我的两个工作线程尝试调用从相机获取图像的函数时,我得到的错误是内存访问冲突错误。我想通过让一个线程获取所有其他线程的图像来解决这个问题。它们每个都有一个 IplImage 变量,用于存储相机捕获的图像。希望这可以帮助。

【问题讨论】:

    标签: .net c++ multithreading opencv message-passing


    【解决方案1】:

    内存错误发生在哪里?你能发布一些更详细的信息吗?它们是在访问您的数据结构还是访问 OpenCV 数据结构期间发生的?如果是后者,那么我不确定消息传递将如何提供帮助。在任何一种情况下,对非线程安全数据结构进行一点锁定听起来就足够了。

    【讨论】:

      【解决方案2】:

      我要在这里冒个险,假设您想以串行方式复制相机图像,然后以多线程方式对复制的数据(IplImage)进行操作。

      为了安全地执行此操作,正如不知名人士指出的那样,您必须锁定您可能使用线程访问的内存(或变量)。如何使用 Windows CRITICAL_SECTION 执行此操作的一个非常简短的示例如下:

      CRITICAL_SECTION cs;
      
      /* Initialize the critical section -- This must be done before locking */
      InitializeCriticalSection(&cs);
      
      ...
      
      /* Release system object when all finished -- 
      usually at the end of the cleanup code */
      DeleteCriticalSection(&cs);
      

      现在,当您访问相机(或任何不可共享的资源)时,您只需用以下两行包围您正在访问的东西:

      EnterCriticalSection(&cs);
      
      /* Operate on your shared data */
      
      LeaveCriticalSection(&cs);
      

      用这两行包围你的代码(例如 IplImage* frame = cvQueryFrame(xyz);)应该可以解决你的冲突。但听起来你的代码可以做更多的组织。

      【讨论】:

        猜你喜欢
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2012-08-02
        • 2011-03-13
        • 2017-06-10
        相关资源
        最近更新 更多