► 前言
本篇將介紹使用OpenCV Python擷取網路攝影機(webcam)的即時畫面影像處理與顯示,以及透過讀取、顯示和儲存硬碟中的影片檔案來實現影片操作。這將幫助大家瞭解如何使用OpenCV在影片上進行各種操作。
► OpenCV Python擷取網路攝影機 OpenCV首先建立了一個VideoCapture物件,指定了網路攝影機的索引,使用再透過 cap.isOpened() 來判斷影片是否正常開啟,正常開啟會回傳 True,失敗則是 False。能夠正常開啟後進入一個無窮迴圈,每次迴圈透過函數read從攝影機中讀取一幀影像,再於視窗上進行顯示。其中還可以透過cap.get(propID): 獲取影片的屬性值以及cap.set(propID, value): 設置影片的屬性值。 import cv2 # 使用網路攝影機的預設索引(通常為0) camera_index = 0 # 建立VideoCapture物件,指定網路攝影機的索引 cap = cv2.VideoCapture(camera_index) # 檢查攝影機是否成功開啟 if not cap.isOpened(): print("無法開啟攝影機") exit() # 設定攝影機屬性,例如幀寬度和幀高度 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 獲取攝影機屬性值,例如幀寬度和幀高度 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print("攝影機幀寬度:", width) print("攝影機幀高度:", height) while True: # 讀取當前幀的影像 ret, frame = cap.read() # 檢查是否成功讀取影像 if not ret: print("無法讀取影像") break # 顯示當前幀的影像 cv2.imshow("Webcam", frame) # 按下Esc鍵退出迴圈 if cv2.waitKey(1) == 27: break # 釋放攝影機資源並關閉視窗 cap.release() cv2.destroyAllWindows()
► OpenCV Python 讀取與顯示影片 OpenCV讀取影片只需要在cv2.VideoCapture中傳入的參數從camera index 改為影片檔案位置,(檔案相對路徑、絕對路徑都可以),就可以進行OpenCV 讀取硬碟中的影片操作了。
import cv2 # 影片檔案的路徑 video_path = 'path/to/your/video/file.mp4' # 建立VideoCapture物件,指定影片檔案路徑 cap = cv2.VideoCapture(video_path) # 檢查影片是否成功開啟 if not cap.isOpened(): print("無法開啟影片檔案") exit() # 設定影片屬性,例如幀寬度和幀高度 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 獲取影片屬性值,例如幀寬度和幀高度 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print("影片幀寬度:", width) print("影片幀高度:", height) while True: # 讀取當前幀的影像 ret, frame = cap.read() # 檢查是否成功讀取影像 if not ret: print("影片讀取完成或無法讀取影像") break # 顯示當前幀的影像 cv2.imshow("Video Playback", frame) # 按下Esc鍵退出迴圈 if cv2.waitKey(1) == 27: break # 釋放影片資源並關閉視窗 cap.release() cv2.destroyAllWindows()
► OpenCV Python 儲存影片 OpenCV使用以下函數(cv2.VideoWriter) 將影像幀序列寫入為影片檔案,透過以下參數進行相關設定。 filename:指定儲存的影片檔案路徑,例如 "output/video.mp4"。 fourcc:指定影片的編碼方式,使用四個字符的代碼。常見的幾種編碼方式包括: MP4V:MP4編碼(需要安裝MPEG-4編碼庫)。 XVID:XVID編碼(需要安裝XVID編碼庫)。 MJPG:Motion-JPEG編碼。 fps:指定影片的幀率(每秒的幀數),例如 30 表示每秒 30 幀。 frameSize:指定影片的幀尺寸,可以是 (width, height) 的元組或整數值。 isColor:指定是否要儲存彩色影像。預設為True。
最後將上面的擷取網路攝影機與儲存影片組合,就可以透過OpenCV進行影片的讀取、顯示與儲存。 import cv2 # 設定網路攝影機索引,0表示第一個網路攝影機 camera_index = 0 # 建立VideoCapture物件,指定網路攝影機索引 cap = cv2.VideoCapture(camera_index) # 設定影片的儲存器 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用MP4編碼 output_path = 'path/to/save/output/video.mp4' fps = 30 # 幀率 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height)) while True: # 讀取當前幀的影像 ret, frame = cap.read() # 檢查是否成功讀取影像 if not ret: print("無法讀取影像") break # 顯示當前幀的影像 cv2.imshow("Camera", frame) # 儲存當前幀的影像到輸出影片 out.write(frame) # 按下Esc鍵退出迴圈 if cv2.waitKey(1) == 27: break # 釋放資源並關閉視窗 cap.release() out.release() cv2.destroyAllWindows()
►Q&A 問題一:為甚麼讀取圖像錯誤?
在讀取圖像時,如果指定的圖像路徑不正確,將無法讀取圖像。因此,要確保提供正確的路徑和檔案名稱。建議採用全英文路徑進行讀取。
問題二:影像解析度不正確
網路攝影機可能支援多種解析度,但程式碼中可能未正確設定所需的解析度。確保程式碼中的解析度設定與攝影機的 支援解析度相匹配,以獲得正確的影像解析度。
問題三:影像變形或畸變
網路攝影機可能具有廣角或魚眼鏡頭,這可能導致影像變形或畸變。在顯示或儲存影像之前, 你可能需要進行校正或去除畸變的處理。這可以通過適當的校正技術,如相機校正或魚眼校正,來實現。
問題四:影片播放速度問題
在讀取和顯示影片時,可能會遇到播放速度不正確的問題,導致影片過快或過慢。這可能是由於設定的幀率不正確或影片本身的幀率不匹配所引起。 檢查幀率設定,確保它與影片的實際幀率相符。
問題五:影片編碼問題
在儲存影片時,可能會遇到編碼問題,導致儲存的影片無法正常播放或讀取。這可能是由於使用不支援的編碼方式或編碼參數設定不正確所引起。 確保選擇適當的編碼方式並正確設定編碼參數,以確保儲存的影片能夠順利播放和讀取。
► 小結
透過以上講解,搭配程式碼進行範例講解與Q&A進行問題解惑,相信各位對於OpenCV擷取網路攝影機的即時畫面影像處理與顯示,以及透過讀取、顯示和儲存硬碟中的影片檔案來實現影片操作能有更深刻的理解,期待下一篇博文吧! |