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() 方法相同的窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dlmopen 在不同的线程中打开多个共享库?

Java多线程与并发库7.多个线程之间共享数据的方式探讨

C++并发与多线程 4_创建多个线程数据共享问题分析

进程与线程

如何使用 OpenCV 在 C++ 中实现高效的 im2col 函数?

小王,在 Java 中如何利用 redis 实现一个分布式锁服务呢???