完美關掉 Python OpenCV 圖片視窗的方法

 

相信各位做影像的同行在驗證自己演算法的時候,
總是像我一樣眼見為憑、需要把圖片秀出來對吧?



在很多的 OpenCV 教學文裡面都教我們用這行程式碼關掉視窗:

cv2.imshow('Image', img)
cv2.waitKey(0)


但是用這行程式碼的問題是如果你按了視窗右上角的 "X" 來關掉視窗,
那麼你的程式就會卡住,因為 OpenCV 不知道視窗被關掉了,
所以視窗的程序就繼續執行跟你演。


我每次遇到這狀況就快要中風,
為了避免各位同行也中風我在此提供解決方法。

cv2.imshow('Image', img)
while True:
    if (cv2.getWindowProperty('Image', cv2.WND_PROP_VISIBLE) <= 0 or cv2.waitKey(1) > 0):
        cv2.destroyWindow('Image')
        break


原理是去檢查名稱叫做 Image 的視窗狀態,
如果他被關掉了,那就把視窗的程序結束掉讓程式就繼續進行。

至於為什麼要放 waitKey(1) 而不是 waitKey(0),
那是因為 waitKey(0) 放在條件式裡面會像王寶釧苦守寒窯十八年,
等你在視窗按下任意鍵。

如果你又按 "X" 把視窗結束掉了,那就真的老死不相往來了。



那你說 CPP 裡面怎麼辦呢?有 CPP 的版本嗎?

我也覺得很奇怪,Python 版的 OpenCV 理論上是 bind CPP版 的 OpenCV ,
兩邊實現應該會一樣?

但是 CPP 中 waitKey(0) 可以偵測視窗關掉(也就是按右上角"X"也能關掉視窗程序)。


以上,謝謝指教。

留言

這個網誌中的熱門文章

[心得] 破解 Google 雲端下載限制(非建立副本)