Opencv - 如何使用与多个线程共享的 imshow() 方法相同的窗口
Posted
技术标签:
【中文标题】Opencv - 如何使用与多个线程共享的 imshow() 方法相同的窗口【英文标题】:Opencv - how use the same window with the imshow() method shared with many threads 【发布时间】:2014-09-15 11:40:20 【问题描述】:我下面的代码有时可以工作,有时却不能按预期工作。基本上我创建了一个线程池,应该在一个窗口中显示图像。为了达到这个效果,每组线程调用同名(windowName变量)的imshow(windowName)方法。所以每个线程组都有一个特定的窗口,应该在其中显示图像。
但是,在运行应用程序时,有时会向同一个线程组显示多个窗口。我相信应该发生的是第一个线程准备窗口,然后将状态更改给另一个线程,然后第二个线程准备另一个窗口(因为第一个尚未准备好),完成所有进程后出现两个窗口。
确保只有第一个线程启动 imshow() 的好的解决方案是什么? 也许这种方法是错误的或不是好的解决方案,我想知道这一点!
部分代码如下:
int processVideo(char * videoFileName, char * projectNameIn, vector<SelectedRegion> * v_region, char * configPar)
char mainWindowName[100];
static char threadWindow[sizeof(mainWindowName)];
//Some code here
sprintf_s(mainWindowName, "ImageProc[Thread Session ID: %00d]", config.threadGroupSession);
//Some code here
cv::Mat videoFrameFeed;
while(capture.read(videoFrameFeed) && !terminateApp)
//Some code here
imshow(mainWindowName, videoFrameFeed);
//Some code here
【问题讨论】:
在主线程中使用cv::namedWindow
,并让线程仅在其(先前创建的)窗口名称上使用cv::imshow
。
另外:提醒一下,openCVs highgui 并不是为了满足最终用户的需求,而只是用于在开发过程中测试/可视化项目的快速机制。如果你不在那个状态,切换到一些真正的 gui...Qt 或类似的东西。
@Micka tks 为您的 cmets。非常有用。但是,在第一条评论中,您说仅将 namedWindow 用于主线程。如何知道线程在代码中是否为“主”?根据您对仅主线程使用并添加全局变量的评论,我暂时解决了创建锁定会话的问题。但我不确定这是否是一个好策略。我把代码怎么换个答案。
在某个地方计算您将创建的线程数(稍后)并将它们分组为块我猜?让程序在创建新块时创建窗口。
【参考方案1】:
在阅读了一些 cmets 之后,我创建了一个锁线程会话来解决。工作正常。我会将代码放在下面以帮助其他人。
//Global Variable
bool global_llock_for_thread = false;
void look_session_image_proc()
while(global_llock_for_thread)
//wait for unlook;
global_llock_for_thread = true;
void unlook_session_image_proc()
global_llock_for_thread = false;
然后我添加下面的代码。
while(capture.read(videoFrameFeed) && !terminateApp)
//Some code here
unlook_session_image_proc();
imshow(mainWindowName, videoFrameFeed);
unlook_session_image_proc();
//Some code here
【讨论】:
以上是关于Opencv - 如何使用与多个线程共享的 imshow() 方法相同的窗口的主要内容,如果未能解决你的问题,请参考以下文章