目標(biāo):
- 1.讀取視頻
- 2.顯示視頻
- 3.保存視頻
讀取、顯示和保存視頻
示例:
import cv2
# 1.創(chuàng)建VideoCapture對(duì)象-->用于讀取視頻
# 1)讀取攝像頭
# cap = cv2.VideoCapture(0)
# 2)視頻流地址:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8")
# 3)視頻文件路徑:D:/迅雷下載/誅仙.mkv
# cap = cv2.VideoCapture("D:/迅雷下載/誅仙.mkv")
if not cap.isOpened(): # 判斷cap是否成功捕獲
print("Cannot open camera")
exit()
# 2.定義解碼器并創(chuàng)造VideoWrite對(duì)象-->用于保存視頻
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 定義解碼器
# 創(chuàng)建視頻流寫(xiě)入對(duì)象VideoWriter,VideoWriter_fourcc為視頻編解碼器毫捣,30為幀播放速率
# (1920, 1080)為視頻幀大小撵彻,要與下面frame的大小一致(否則會(huì)導(dǎo)致保存的視頻無(wú)法播放)
out = cv2.VideoWriter('D:/迅雷下載/output.avi', fourcc, 30, (1920, 1080))
while True:
# 3.讀取視頻
ret, frame = cap.read() # ret表示是否成功獲取幀徽龟,視頻讀到結(jié)尾傅瞻,ret就為False。frame是每一幀的圖像钦扭。
if not ret: # 如果未成功讀取幀,就退出循環(huán)
print("Can't receive frame (stream end?). Exiting ...")
break
# 4.顯示視頻圖片
cv2.namedWindow("frame", cv2.WINDOW_NORMAL) # 創(chuàng)建一個(gè)窗口床绪,可調(diào)整大小
cv2.imshow("frame", frame) # 展示視頻圖片
# 5.保存視頻圖片
# frame = cv2.flip(frame, 0) # 沿x軸方向翻轉(zhuǎn)圖片并保存
out.write(frame) #保存視頻圖片
print(frame.shape) # (1080, 1920, 3)
# 按'q'鍵退出循環(huán)
if cv2.waitKey(41) & 0xFF == ord('q'):
break
cap.release() # 釋放VideoCapture對(duì)象
out.release() # 釋放VideoWriter對(duì)象
cv2.destroyAllWindows() # 銷(xiāo)毀所有窗口
函數(shù)分析:
cv2.VideoCapture() 創(chuàng)建VideoCapture對(duì)象-->用于讀取視頻
它的參數(shù)可以是設(shè)備索引或視頻文件的名稱(chēng)客情。
參數(shù)是0,表示打開(kāi)筆記本的前置攝像頭癞己。
參數(shù)是1膀斋,表示打開(kāi)筆記本的后置攝像頭。
參數(shù)是視頻文件路徑則采集相應(yīng)視頻痹雅。cap.isOpened() 檢查cap是否已初始化
-
VideoWriter_fourcc(c1, c2, c3, c4) 定義解碼器
FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定視頻編解碼器的4字節(jié)代碼仰担。可用代碼列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到绩社。它取決于平臺(tái)摔蓝。遵循編解碼器對(duì)我來(lái)說(shuō)效果很好。- 在Fedora中:DIVX愉耙,XVID项鬼,MJPG,X264劲阎,WMV1绘盟,WMV2。(最好使用XVID悯仙。MJPG會(huì)生成大尺寸的視頻龄毡。X264會(huì)生成非常小的尺寸的視頻)
- 在Windows中:DIVX(尚待測(cè)試和添加)
- 在OSX中:MJPG(.mp4),DIVX(.avi)锡垄,X264(.mkv)沦零。
FourCC代碼作為MJPG的
cv.VideoWriter_fourcc('M','J'货岭,'P'路操,'G')
orcv.VideoWriter_fourcc(*'MJPG')
傳遞疾渴。 cv2.VideoWriter() 創(chuàng)建一個(gè)VideoWriter對(duì)象-->用于保存視頻
第一個(gè)參數(shù)表示保存的視頻文件名
第二個(gè)參數(shù)為視頻解碼器
第三個(gè)參數(shù)為幀播放速度
第四個(gè)參數(shù)為視頻幀大小ret, frame = cap.read() 按幀讀取視頻,一幀就是一張圖片屯仗。
ret是bool類(lèi)型搞坝,表示是否成功獲取幀。如果視頻讀到結(jié)尾魁袜,那么ret就為False桩撮。
frame 是每一幀的圖像,是一個(gè)三維矩陣numpy.ndarray峰弹。cap.release() 釋放VideoCapture對(duì)象
out.release() 釋放VideoWriter對(duì)象