更新於 2024/03/05閱讀時間約 3 分鐘

【💊 Python的解憂錦囊】OpenCV如何讀取特定時間區段?

raw-image


當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。

在進入主題之前, 有一些基本概念務必先行建立,

  1. 一個影片是由多張圖片組成的, 因此最小單元為一張圖片。
  2. FPS: Frames Per Second的縮寫, 也就是1秒內播放多少個圖像。
  3. 影像索引位置 = N秒 * FPS。

任務目標

假設我們已經知道今天需要對一個影片的10 ~ 15秒之間的影像進行處理時(文字辨識、人臉辨識…), 應該要怎麼切出這一段影像資料呢? 這雖然是一個簡單的I/O處理, 但我們會需要一點計算與單位轉換, 這次的主軸主要是協助我們理解影像處理的基本單位。

關鍵的 cv2.CAP_PROP_POS_FRAMES

我們先來翻翻文檔: https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html


我們可以看到說明是指定接下來要處理的frame位置, 既然已經知道怎麼使用了, 那搭配我們上述的基礎知識, 相信聰明的大家應該都能夠輕易的轉換及指定。

完整範例



import cv2

# 影片的路徑
video_path = 'your_video.mp4'

# 影片捕捉物件
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)

# 設定開始時間(秒)
start_time_sec = 10
start_frame = int(start_time_sec * fps)
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)

# 設定結束時間(秒)
end_time_sec = 15
end_frame = int(end_time_sec * fps)

# 如果還沒處理到結束的frame位置則...
while cap.get(cv2.CAP_PROP_POS_FRAMES) < end_frame:
ret, frame = cap.read()

if not ret:
break # 當所有幀都被讀取完畢時退出循環

# 在這裡處理每一幀的操作,例如顯示視頻,保存幀等

# 釋放資源
cap.release()
cv2.destroyAllWindows()

結語

相較於「語音領域」又是一門全新領域的嘗試,不過有了OpenCV 處理起來算是蠻順手的, 雖然尚未掌握的非常全面, 但初步的影像處理已經能夠滿足我們入門的初學者了, 接著我們可以針對每一張frame進行影像的辨識、車牌辨識、OCR…各式各樣的影像應用。


更多關於影像處理的知識歡迎來「🔒 阿Han的軟體心法實戰營 - 影像辨識」坐坐。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.