cv::imshow GUI 应用程序运行时阻塞线程
cv::imshow blocks thread when GUI application runs
我已经尝试对此调试了一段时间,但我无能为力,所以我会试着在这里问这个问题。我想我只是想寻求有关可能导致此问题的提示。
我有两个程序:一个执行大量计算机视觉工作的 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。图像不会显示,线程会阻塞,因此后端不会再进行任何操作。 window 是在同一个 class 的构造函数中创建的,如下所示:
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 是 Python 中一个相当简单的基于 Qt 的应用程序,它通过本地套接字将命令传送到后端。它应该是完全独立的;它甚至是用脚本语言编写的,运行当后端不存在时也是如此(后端是一个插件)。
我在调试时注意到的其他一些事情:
- 此错误仅存在于 Windows。至少,它不会出现在Ubuntu.
- 当我将
cv::imshow("projectorDisplay",cv::imread("testimage.png"));
添加到构造函数时,它可以正常显示。
- 当我添加
cv::imshow("projectorDisplay",cv::imread("testimage.png"));
而不是它被阻塞的行时,它也会在新的 imshow
处阻塞,所以这不仅仅是图像损坏的问题。
- 如果我不在构造函数中使 window 全屏显示,问题仍然存在。
- 当我用
cv::imshow("projectorDisplay2",display_image)
替换阻塞线时,会创建一个新的 window 并正确显示图像。
- 当我在构造函数中将
CV_WINDOW_NORMAL
标志更改为 CV_WINDOW_OPENGL
时,后端在启动时立即崩溃。
有没有人知道什么会导致这样的事情以及我应该去哪里解决它?
答案简单得令人不安;在没有 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。图像不会显示,线程会阻塞,因此后端不会再进行任何操作。 window 是在同一个 class 的构造函数中创建的,如下所示:
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 是 Python 中一个相当简单的基于 Qt 的应用程序,它通过本地套接字将命令传送到后端。它应该是完全独立的;它甚至是用脚本语言编写的,运行当后端不存在时也是如此(后端是一个插件)。
我在调试时注意到的其他一些事情:
- 此错误仅存在于 Windows。至少,它不会出现在Ubuntu.
- 当我将
cv::imshow("projectorDisplay",cv::imread("testimage.png"));
添加到构造函数时,它可以正常显示。 - 当我添加
cv::imshow("projectorDisplay",cv::imread("testimage.png"));
而不是它被阻塞的行时,它也会在新的imshow
处阻塞,所以这不仅仅是图像损坏的问题。 - 如果我不在构造函数中使 window 全屏显示,问题仍然存在。
- 当我用
cv::imshow("projectorDisplay2",display_image)
替换阻塞线时,会创建一个新的 window 并正确显示图像。 - 当我在构造函数中将
CV_WINDOW_NORMAL
标志更改为CV_WINDOW_OPENGL
时,后端在启动时立即崩溃。
有没有人知道什么会导致这样的事情以及我应该去哪里解决它?
答案简单得令人不安;在没有 QT 的情况下重新编译 opencv 可以解决问题。