Mac OS 運行opencv-python 顯示圖片手動關閉後,程序卡死問題

最近在學一點opencv的基礎操作發現每次使用例如代碼:

cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

關閉圖片後,程序都無法繼續運行。

問題及解決詳情可參考:https://stackoverflow.com/questions/6116564/destroywindow-does-not-close-window-on-mac-using-python-and-opencv

 

當我們通過Opencv的imshow()方法顯示圖像後,我們會使用waitKey()方法來保持窗口存在並展示圖像;其中waitKey(0)表示一直等待不停止。運行程序會堵塞並且一直等待用戶在圖片窗口按下ESC鍵。而當我們通過圖像窗口的關閉按鈕關閉圖像後,程序依然被堵塞,而此時我們所期望的是程序能夠繼續運行下去,因此我們需要檢測圖像窗口是否被關閉。

 

解決:

不再使用waitKey(0)來顯示圖像,轉而通過循環來保持圖像的展示,同時檢測:

1.用戶是否按下指定按鍵

2.窗口是否被關閉

我們通過獲取窗口的WND_PROP_VISIBLE屬性來判斷窗口是否存在,使用到的方法爲:cv.getWindowProperty(win_name,prop_id),該方法能夠獲取到的窗口屬性都有:

//! Flags for cv::setWindowProperty cv::getWindowProperty
enum WindowPropertyFlags {
       WND_PROP_FULLSCREEN   = 0, //!< 全屏(can be WINDOW_NORMAL or WINDOW_FULLSCREEN).
       WND_PROP_AUTOSIZE     = 1, //!<自動大小(can be WINDOW_NORMAL or WINDOW_AUTOSIZE).
       WND_PROP_ASPECT_RATIO = 2, //!< 保持縱橫比(can be set to WINDOW_FREERATIO or WINDOW_KEEPRATIO).
       WND_PROP_OPENGL       = 3, //!< opengl窗口.
       WND_PROP_VISIBLE      = 4  //!< 檢測窗口是否存在並且是否可見
     };

綜合之後,顯示圖片並且不堵塞程序的方法是:

import cv2
 
img = cv2.imread("imori.jpg")
cv2.imshow('image',img)
while cv2.waitKey(100) != 27:# loop if not get ESC
    if cv2.getWindowProperty('img',cv2.WND_PROP_VISIBLE) <= 0:
        break
cv2.destroyWindow('image')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章