cv :: imshow在GUI应用程序运行时阻塞线程

时间:2015-03-05 16:40:04

标签: python c++ qt opencv

我一直试图调试一段时间,但我已经结束了,所以我会试着在这里问这个问题。我想我只是想问一下可能导致这种情况的提示。

我有两个程序:一个C ++后端,它可以完成很多计算机视觉工作,还有一个显示GUI的Python前端。 GUI是入口点,并在加载后启动后端。目前,后端以某种方式阻止了它的主线程:

if(image.size() != getImageSize()) {
    cv::imshow("projectorDisplay",display_image(cv::Rect(0,0,getImageSize().width,getImageSize().height)));
} else {
    cv::imshow("projectorDisplay",display_image); //Thread blocks at this line.
}
cv::waitKey(10);

这意味着在连接到计算机的投影仪上显示display_image。图像没有显示,并且线程阻塞,因此后端不再进一步。该窗口在同一类的构造函数中创建,如下所示:

cv::namedWindow("projectorDisplay",CV_WINDOW_NORMAL);
cv::moveWindow("projectorDisplay",2000,0); //Move the window to the projector screen. TODO: Hard-coded value.
cv::setWindowProperty("projectorDisplay",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN); //Make fullscreen.
cv::waitKey(50);

但是这里有一个奇怪的部分让我觉得这是一个非常困难的错误:当我在没有GUI的情况下运行后端时,它运行正常。 GUI是一个相当简单的Qt-基于Python的应用程序,通过本地套接字将命令传递给后端。它应该完全分开;它甚至用脚本语言编写,并且当后端不存在时运行(后端是一个插件)。

调试时我注意到的其他一些事情:

  • 此错误仅适用于Windows。至少,它不会出现在Ubuntu中。
  • 当我将cv::imshow("projectorDisplay",cv::imread("testimage.png"));添加到构造函数中时,它会正确显示。
  • 当我添加cv::imshow("projectorDisplay",cv::imread("testimage.png"));而非其他方式被阻止的行时,它会阻止新的imshow,所以这不仅仅是一个损坏图像的问题。
  • 如果我不在构造函数中全屏显示窗口,问题仍然存在。
  • 当我用cv::imshow("projectorDisplay2",display_image)替换阻止线时,会创建一个新窗口并正确显示图像。
  • 当我在构造函数中将CV_WINDOW_NORMAL标志更改为CV_WINDOW_OPENGL时,后端会在启动时立即崩溃。

有没有人知道可能导致这种事情的原因以及我应该在哪里修复它?

1 个答案:

答案 0 :(得分:1)

答案令人不安;重新编译没有QT的opencv修复了这个问题。