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

在很多的 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”也能關掉視窗程序)。

以上,謝謝指教。

By wuyiulin

喜歡騎單車的影像算法工程師

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *