Python | OpenCV 影片讀取與播放
📚 前言
在前一章我們學會了如何儲存圖片。
這一篇要進一步學習 影片讀取與播放,理解影片其實就是一連串影格(frames)的集合。
範例影片
- 載點:video.zip
- 來源:此影片取自 Pexels,屬於無版權影片,可自由下載與使用。
- 內容:影片呈現一個程式編輯畫面,長度約 2 秒,適合作為 OpenCV 測試範例。
🎥 使用 VideoCapture 讀取影片
OpenCV 提供 cv2.VideoCapture() 來讀取影片檔或開啟攝影機。官方文件
語法:
1 2
| cap = cv2.VideoCapture("video.mp4") cap = cv2.VideoCapture(0)
|
👉 在 Windows 環境下,若遇到錯誤可加上 cv2.CAP_DSHOW:
1
| cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
|
🖼️ 播放影片逐幀顯示
使用 cap.read() 讀取影片的每一幀 (frame),並用 imshow() 顯示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import cv2
cap = cv2.VideoCapture("video.mp4")
if not cap.isOpened(): print("Cannot open video") exit()
while True: ret, frame = cap.read() if not ret: print("End of video or read error") break
cv2.imshow("Video", frame)
if cv2.waitKey(25) == ord('q'): break
cap.release() cv2.destroyAllWindows()
|

圖:逐幀播放影片,按下 q 鍵結束,或是等影片結束
🌈 顏色轉換 (cvtColor)
可以在播放過程中轉換顏色,例如轉成灰階:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import cv2
cap = cv2.VideoCapture("video.mp4")
if not cap.isOpened(): print("Cannot open video") exit()
while True: ret, frame = cap.read() if not ret: print("End of video or read error") break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow("Gray Video", gray)
if cv2.waitKey(25) == ord('q'): break
cap.release() cv2.destroyAllWindows()
|

圖:即時攝影機圖片轉換為灰階顯示
👉 提示:waitKey() 的參數通常設為 1000/FPS,能讓播放速度更接近原始影片。
🔧 影片屬性與隨機存取
除了逐幀播放,也能讀取影片屬性,甚至跳到指定影格:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import cv2
cap = cv2.VideoCapture("video.mp4")
fps = cap.get(cv2.CAP_PROP_FPS) frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"FPS: {fps}, Frames: {frame_count}, Size: {width}x{height}")
cap.set(cv2.CAP_PROP_POS_FRAMES, 30) ret, frame = cap.read() if ret: cv2.imshow("Frame 30", frame) cv2.waitKey(0)
cap.release() cv2.destroyAllWindows()
|

圖:讀取影片屬性並定位到指定影格
🌐 讀取 MJPEG 串流影片
除了本地影片檔與攝影機,也能讀取網路串流,例如交通監視器的 MJPEG 圖片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import cv2
url = "https://cctvn.freeway.gov.tw/abs2mjpg/bmjpg?camera=73270" cap = cv2.VideoCapture(url)
if not cap.isOpened(): print("Cannot open stream") exit()
while True: ret, frame = cap.read() if not ret: print("Stream disconnected") break
cv2.imshow("Traffic Camera", frame)
if cv2.waitKey(1) == ord('q'): break
cap.release() cv2.destroyAllWindows()
|

圖:讀取交通監視器的 MJPEG 串流圖片
👉 MJPEG 串流通常延遲較低,但解析度與 FPS 可能受限。
⚠️ 注意事項
- 效能問題:影片播放速度與
waitKey() 的參數有關,數值越小更新越快。
- 資源釋放:使用完
VideoCapture 記得呼叫 release(),並用 destroyAllWindows() 關閉視窗。
- 顏色通道:同樣是 BGR,不是 RGB。
- 隨機存取:不同影片格式支援度不同,跳幀可能不精準。
- 串流穩定性:MJPEG 串流可能斷線,需要重新建立連線。
結語 🎯
這一篇我們學會了如何使用 cv2.VideoCapture() 讀取影片、逐幀播放、顏色轉換、屬性查詢,以及 MJPEG 串流。
下一篇將進一步學習 影片輸出與編碼,掌握圖片處理的更多技巧。
註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
OpenCV-tutorial_py_video_display
Pexels
1968-高速公路資訊網