從攝像頭采集視頻
相關接口 -?VideoCapture
VideoCapture 用于從視頻文件、攝像頭或其他視頻流設備中讀取視頻幀。它可以捕捉來自多種源的視頻。
主要參數:
cv2.VideoCapture(source):
source: 這是一個整數或字符串,表示視頻的來源。
- 如果是整數(如0、1等),表示打開對應的攝像頭(0通常是默認攝像頭)。
- 如果是字符串,表示視頻文件的路徑,或者RTSP流、HTTP流等視頻流地址。
常用方法:
cap.read():
- 返回兩個值:ret(布爾值,表示是否成功讀取)和 frame(當前幀圖像)。
cap.set(prop_id, value):
- 設置視頻捕獲設備的屬性。prop_id是屬性標識符,value是設置的值。
常見的 prop_id 參數:
- cv2.CAP_PROP_FPS:幀率(每秒幀數)。
- cv2.CAP_PROP_FRAME_WIDTH:視頻寬度。
- cv2.CAP_PROP_FRAME_HEIGHT:視頻高度。
- cv2.CAP_PROP_BRIGHTNESS:亮度。
- cv2.CAP_PROP_CONTRAST:對比度。
代碼:
以下代碼的作用是打開攝像頭,將采集到的視頻流顯示到窗口中。
import cv2#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()
cv2.destroyAllWindows()
?讀取視頻文件
只需要修改 VideoCapture 接口參數即可:
import cv2#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#讀取視頻文件
cap = cv2.VideoCapture('D:\\resource\\D026網絡購物互聯網科技.mov')while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#等待鍵盤事件key = cv2.waitKey(40)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()
cv2.destroyAllWindows()
其中 waitKey 設置為40ms,由于當前播放的視頻幀率是25fps,然后1000/25 = 40,于是將waitkey等待間隔設置為了40ms。?
運行后:
視頻錄制
相關接口 - videoWrite
VideoWriter 用于將視頻幀寫入視頻文件。可以設置視頻格式、編解碼器、幀速率等。
主要參數:
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
filename: 輸出視頻文件的路徑或文件名。這個文件將存儲捕捉到的視頻。
fourcc: 編解碼器代碼(FourCC)。這指定了視頻的編碼格式。常見的 fourcc 編碼器包括:
- cv2.VideoWriter_fourcc(*'XVID'):XVID編碼。
- cv2.VideoWriter_fourcc(*'MJPG'):MJPEG編碼。
- cv2.VideoWriter_fourcc(*'MP4V'):MP4編碼。
- cv2.VideoWriter_fourcc(*'H264'):H.264編碼。
fps: 幀率(每秒幀數)。例如,30 表示每秒30幀。
frameSize: 視頻幀的尺寸,通常是一個元組 (width, height),如 (640, 480)。
isColor: 布爾值,指示是否保存為彩色視頻。True 表示彩色視頻(默認),False 表示灰度視頻。
常用方法:
writer.write(frame): 將視頻幀寫入輸出文件。
writer.release(): 釋放視頻寫入對象,確保文件正確關閉。
代碼:
以下代碼的作用是從攝像頭采集視頻,顯示到窗口中,同時保存到本地。
import cv2#創建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#寫數據到多媒體文件vw.write(frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()#釋放VideoWriter
vw.release()cv2.destroyAllWindows()
查看輸出視頻屬性:
代碼優化:
- 增加攝像頭開啟判斷
- 增加采集視頻失敗處理
import cv2#創建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while cap.isOpened:ret, frame = cap.read()if ret == False :break;#將視頻幀在窗口中顯示cv2.imshow('video', frame)cv2.resizeWindow('video', 640, 480)#寫數據到多媒體文件vw.write(frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()#釋放VideoWriter
vw.release()cv2.destroyAllWindows()