2

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

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

4

2 回答 2

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);)应该可以解决您的冲突..但听起来您的代码可以做更多的组织..

于 2009-11-03T03:44:38.763 回答
0

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

于 2009-10-30T02:48:41.217 回答