Opencv imshow()在更新时冻结

use*_*931 10 python opencv image-processing freeze imshow

对于我的图像处理算法,我使用的是python/OpenCV.我的算法输出应该在同一个窗口一遍又一遍地更新.

然而,有时窗口冻结并且根本不更新,但算法仍在运行并且同时多次更新图片.在这台Ubuntu机器上,窗口变成深灰色.

以下是相关代码的摘录:

for i in range(0,1000):
    img = loadNextImg()
    procImg = processImg(img)
    cv2.imshow("The result", procImg)
    cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

注意:processImg()程序大约需要1-2秒.该行在cv2.imshow(procImg)第一个实例中创建窗口(即没有先前的调用)

use*_*931 8

增加等待时间可以解决此问题.但是在我看来,这是不必要的睡眠时间(20毫秒/帧),即使它并不多.

更改

cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

至

cv2.waitKey(20)
Run Code Online (Sandbox Code Playgroud)

在我的情况下防止窗户冻结.所需的等待时间的持续时间可能因机器而异.


Dha*_*rma 8

我的建议是使用Matplotlib pyplot来显示图像.我这样做的方式如下.

import matplotlib.pyplot as plt
# load image using cv2....and do processing.
plt.imshow(cv2.cvtColor(image, cv2.BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()
Run Code Online (Sandbox Code Playgroud)

我知道它不能解决cv2.imshow的问题,但它解决了我们的问题.

  • 在“cv2”的“4.1.2”版本(通过“opencv-python”包含)中,传递给“cvtColor”的标志似乎已从“cv2.BGR2RGB”更改为“cv2.COLOR_BGR2RGB”。 (2认同)

小智 5

紧随cv2.destroyAllWindows()其后添加cv2.waitKey()


bst*_*adt 2

所以我认为这里发生的是,窗口(highGUI 的一个元素)在第一次调用 imshow 后仍然处于活动状态,正在等待 waitKey 函数的某种响应,但由于程序而变得不活动被困在 loadNextImg 函数的 processImg 中进行计算。如果您不关心效率的轻微浪费(即您不是在每个操作都很重要的嵌入式系统上运行),您应该在 waitKey 之后销毁窗口,并在 imshow 之前重新创建。由于在处理和加载图像期间窗口不再存在,因此 highGUI 不会卡住等待 waitKey 的调用,并且不会变得无响应。