Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-11   Python OpenCV 02.入門篇:基礎操作   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 影片讀取與播放

📚 前言

在前一章我們學會了如何儲存圖片。
這一篇要進一步學習 影片讀取與播放,理解影片其實就是一連串影格(frames)的集合。

範例影片

  • 載點:video.zip
  • 來源:此影片取自 Pexels,屬於無版權影片,可自由下載與使用。
  • 內容:影片呈現一個程式編輯畫面,長度約 2 秒,適合作為 OpenCV 測試範例。

🎥 使用 VideoCapture 讀取影片

OpenCV 提供 cv2.VideoCapture() 來讀取影片檔或開啟攝影機。官方文件

語法:

1
2
cap = cv2.VideoCapture("video.mp4")   # 讀取影片檔案
cap = cv2.VideoCapture(0) # 讀取攝影機 (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)

# 按下 q 鍵結束播放
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)

# 按下 q 鍵結束播放
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) # 每秒幀數 (Frames Per Second)
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}")

# 跳到第 30 幀
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-高速公路資訊網