最近在學一點opencv的基礎操作發現每次使用例如代碼:
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
關閉圖片後,程序都無法繼續運行。
當我們通過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')