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函数的目的,还是因为其他原因?
当您按退出键时,它将显式调用destroyAllWindows
。当您按下s
时,它将首先保存图像,然后操作系统将在退出时销毁所有窗口。如果再次按其他任何键,则操作系统将在退出时关闭并重新分配所有窗口。
来自OpenCV docs:
您可以呼叫
destroyWindow()
或destroyAllWindows()
关闭窗口并取消分配任何关联的内存使用情况。对于一个简单的程序,您实际上不必调用这些函数,因为所有应用程序的资源和窗口自动关闭通过操作系统退出。
问题出在waitKey
而不是destroyAllWindow
上。后者可以正常工作,并且应做的事。
您必须了解,显示窗口时(按imshow()
),您的应用程序必须具有主事件循环,在该循环中,将处理所有与窗口交互相关的事件,例如单击,调整大小,移动,显示等。 GUI应用程序的主循环是在waitKey()
函数调用中创建和处理的。
您的电流如下:
waitKey
的k == 's'
,因此无论按下什么键,所有窗口都将关闭。
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('lena_copy.png', img)
cv2.waitKey(0)
通过添加最后一行,您开始新的事件循环,并且窗口仍然可见。