【问题标题】:cv::imshow blocks thread when GUI application runscv::imshow 在 GUI 应用程序运行时阻塞线程
【发布时间】:2015-05-07 03:06:18
【问题描述】:

我已经尝试调试了一段时间,但我无能为力,所以我会尝试在这里问这个问题。我想我只是在询问可能导致此问题的原因。

我有两个程序:一个执行大量计算机视觉工作的 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 时,后端在启动时立即崩溃。

有没有人知道什么会导致这样的事情以及我应该在哪里解决它?

【问题讨论】:

    标签: python c++ qt opencv


    【解决方案1】:

    答案简单得令人不安;在没有 QT 的情况下重新编译 opencv 可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 2014-05-24
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      相关资源
      最近更新 更多