影像處理常從讀取一張圖或一段影片開始。這篇把 OpenCV 的讀取、視窗顯示、按鍵等待與圖片儲存分開整理,方便實作時快速找到對應指令。

本篇重點
  • 讀取圖片與影片來源
  • 建立顯示視窗並處理按鍵等待
  • 儲存圖片、調整視窗與釋放畫面

原始實作記錄於 2020 年;以下操作畫面與程式範例保留當時版本。

下面依讀取、顯示、儲存與關閉的順序整理常用指令。先用一張確定存在的圖片練習,再把相同流程延伸到影片或相機。

讀取圖片檔案

以檔案路徑讀取圖片,將結果保存到變數中。路徑錯誤或檔案無法解碼時,Python 的 imread 可能回傳 None,應先確認讀取成功再顯示。

1
img = cv2.imread("test.jpg") # img = test.jpg

讀取影片檔案

建立影片來源後,以 read 逐幀取得畫面,並檢查回傳的成功旗標。旗標為 False 時,可能已到影片結尾,也可能讀取失敗。

1
vc=cv2.VideoCapture("output.mp4") #vc = output.mp4

等待任何按鍵

waitKey(0) 會持續等待按鍵;使用正整數時則等待指定的毫秒數。它同時讓 OpenCV 視窗處理事件,顯示圖片或影片時應配合呼叫。

1
cv2.waitKey(0)

顯示視窗

指定視窗名稱並顯示影像。OpenCV 預設讀取的彩色影像使用 BGR 通道順序;交給其他使用 RGB 的工具前,需確認通道是否需要轉換。

1
cv2.imshow("test",img) # ("視窗名稱",要顯示的圖片或影片)

關閉顯示視窗

關閉單一視窗應使用 cv2.destroyWindow("test");關閉全部視窗則使用不帶參數的 cv2.destroyAllWindows()。以下保留原始範例。

1
2
cv2.destroyAllWindows("test") # 關閉指定的"test"視窗
cv2.destroyAllWindows() # 關閉全部視窗

自由調整視窗大小

先建立可調整大小的視窗,再顯示影像。

1
2
cv2.namedWindow('test', cv2.WINDOW_NORMAL) # 讓視窗可以自由縮放大小
cv2.imshow("test",img) # 顯示視窗

寫入圖片檔案

依輸出副檔名選擇格式,並視需要設定品質或壓縮層級。寫入後檢查回傳值與輸出檔案,不要只因為程式沒有報錯就認定圖片已保存。

1
2
3
4
5
6
7
8
9
10
11
12
# 寫入圖檔
cv2.imwrite('output.jpg', img)

# 寫入不同圖檔格式...
cv2.imwrite('output.png', img)
cv2.imwrite('output.tiff', img)

# 設定 JPEG 圖片品質為 90(可用值為 0 ~ 100)
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])

# 設定 PNG 壓縮層級為 5(可用值為 0 ~ 9)
cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 5])

把指令串成一個流程

先讀取並檢查影像,再顯示與處理按鍵,最後視需要儲存結果並關閉視窗。影片與相機另需釋放 VideoCapture;關閉視窗和釋放影像來源是兩個不同的動作。

參考:OpenCV 官方影像入門。