相信各位做影像的同行在驗證自己演算法的時候,
總是像我一樣眼見為憑、需要把圖片秀出來對吧?
在很多的 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”也能關掉視窗程序)。
以上,謝謝指教。