OpenCV: cv::imshow() freezes
我已经编写了一些代码,当前包含两个窗口,以显示某些处理算法的不同阶段。 很简单,我用cv::namedWindow()创建了两个窗口,并用cv::imshow()显示cv::Mat。 我遇到一个问题,其中cv::imshow()一次又一次地(但并非总是如此)拒绝更新两个窗口。 该程序尚未挂起,我可以看到它仍在工作并处理传入的帧(因为我正在将内容打印到终端中以显示此内容),只是窗口没有显示新的帧。 在每次调用cv::imshow()之后,我都包括了cv::waitKey(2),但这无济于事。
这很烦人,我似乎无法在网上找到任何东西。 这并非总是会发生,但它经常会发生。 有时需要几分钟,有时需要几秒钟。
我正在使用带有OpenCV 2.3.1的Ubuntu 12.04(和Ubuntu 11.10,这在两台带有两个不同摄像头的机器上都发生)。
-
传入帧很有可能是一个问题。您还可以考虑检查Mat中随机独立元素的值,以确保它们确实正确。请发布导致此问题的代码。
-
尝试更大的延迟:waitKey(20);可能是您的计算机无法在2毫秒内处理imshow()请求。
-
@vasile:这似乎没有什么不同。
-
@ go4sri:代码很大而且相当复杂。我以为可能是我错过了.release()或其他地方的东西,但是我只是检查了一下而没有。我正在重用相同的变量,但是帧本身是由不同的线程捕获的,并放置在缓冲区中。我不确定是什么地方出了问题,因为其他所有东西都工作正常,而其中的一部分将取决于cv::Mat的某些元素。
-
@vasile waitKey是显示图像后的延迟,并且不包括加载和显示图像的时间。
-
好。尝试使用imwrite()将Mat写入文件。在外部图像查看器中打开文件以查看其是否正确打开。
-
@ go4sri当主线程在waitKey中时,将调用处理窗口显示的代码。实际上,在该函数中处理窗口事件,例如鼠标移动,窗口移动,显示等。
-
我还尝试使用cv::imwrite()仔细检查保存的图像。我提供给可视化程序线程(类)的内容正在更新,但我想使用cv::mshow()显示的cv::Mat image内部为空白。
解决这个问题的一种方法是使用
cv :: destroyWindow()
调用窗口后。 如果您仅显示一系列图像,则效果很好,但如果显示视频,则效果不佳。
-
不幸的是,我实时显示来自摄像机的帧,因此无法正常工作。
-
您能否澄清在哪里确切使用cv::destroyWindow()? 是在cv::waitKey()之后吗?