OpenCV destroyallWindow函数不起作用?

问题描述 投票:0回答:2
import cv2
img = cv2.imread('lena.jpg', -1)
cv2.imshow('image', img)
k = cv2.waitKey(0) & 0xFF
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('lena_copy.png', img)

我几天前才刚开始使用OpenCV。当我在使用这些功能时,我注意到此错误。如果我理解正确,则该脚本应首先显示图像,然后将其销毁或保存,具体取决于我是否按退出键或s键。但是,无论我按了什么键,都没有关系。窗户被破坏了。就像我不需要destroyAllWindows函数来销毁所有窗口一样,我所需要的只是按下一个随机键。是因为我误解了destroyAllWindows函数的目的,还是因为其他原因?

python-3.x opencv
2个回答
0
投票

当您按退出键时,它将显式调用destroyAllWindows。当您按下s时,它将首先保存图像,然后操作系统将在退出时销毁所有窗口。如果再次按其他任何键,则操作系统将在退出时关闭并重新分配所有窗口。

来自OpenCV docs

您可以呼叫destroyWindow()destroyAllWindows()关闭窗口并取消分配任何关联的内存使用情况。对于一个简单的程序,您实际上不必调用这些函数,因为所有应用程序的资源和窗口自动关闭通过操作系统退出。


0
投票

问题出在waitKey而不是destroyAllWindow上。后者可以正常工作,并且应做的事。

您必须了解,显示窗口时(按imshow()),您的应用程序必须具有主事件循环,在该循环中,将处理所有与窗口交互相关的事件,例如单击,调整大小,移动,显示等。 GUI应用程序的主循环是在waitKey()函数调用中创建和处理的。

您的电流如下:

  1. 显示窗口
  2. 按任意键
  3. 由于没有再次调用waitKeyk == 's',因此无论按下什么键,所有窗口都将关闭

if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('lena_copy.png', img)
    cv2.waitKey(0)

通过添加最后一行,您开始新的事件循环,并且窗口仍然可见。

© www.soinside.com 2019 - 2024. All rights reserved.