📢 公告:OpenCV 系列文章目前正在重構整理中,部分文章已暫時下架,後續會陸續補上,完成時間待定。感謝耐心等候!

Like Share Discussion Bookmark Smile

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

Python | OpenCV 影片讀取與播放

📚 前言

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

🎨 範例影片

  • 來源:Pexels,屬於無版權影片,可自由下載與使用。
  • 內容:影片呈現一個終端機畫面,長度約 2 秒,適合作為 OpenCV 測試範例。
  • 下載後將檔名改為 sample.mp4,放到專案的 assets/ 目錄下。

🎥 使用 VideoCapture 讀取影片

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

語法:

1
2
cap = cv2.VideoCapture("assets/sample.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
23
# read_video.py
import cv2

cap = cv2.VideoCapture("assets/sample.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
24
# read_video_gray.py
import cv2

cap = cv2.VideoCapture("assets/sample.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
22
# video_properties.py
import cv2

cap = cv2.VideoCapture("assets/sample.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
23
# read_mjpeg_stream.py
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 串流。
下一篇進入 影片輸出與編碼,學習如何將影格編碼並輸出為影片檔案。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
OpenCV-tutorial_py_video_display
Pexels
1968-高速公路資訊網