[CV2] 讀取視頻
[注:文章里的CV2均為小寫]
OpenCV的VideoCapture類和VideoWriter類提供了視頻處理功能,支持各種格式的視頻文件。
讀取并顯示視頻步驟:
將視頻文件或者攝像頭作為數(shù)據(jù)源來(lái)創(chuàng)建VideoCapture對(duì)象
調(diào)用VideoCapture對(duì)象的read()方法獲取視頻中的幀,每一幀都是一幅圖像
調(diào)用VideoWriter對(duì)象的write()方法將幀寫入視頻文件,或者調(diào)用CV2.imshow()函數(shù)在窗口中顯示幀(即播放視頻)
播放視頻的實(shí)質(zhì)是逐幀讀取和顯示幀圖像
僅能讀取視頻畫面,無(wú)法獲得視頻聲音
播放視頻
import CV2 as cv?? # 導(dǎo)入庫(kù)換名為cv
bga=cv.VideoCapture('star.mpg') #? 創(chuàng)建對(duì)象,導(dǎo)入視頻
fps=int(bga.get(cv.CAP_PROP_FPS)) # 讀取視頻的幀速率
# 讀取視頻的高和寬,看起來(lái)麻煩,不過是get()方法和參數(shù)罷了
size=(int(bga.get(cv.CAP_PROP_FRAME_HEIGHT)),int(bga.get(cv.CAP_PROP_FRAME_WIDTH)))
print('幀速率:',fps)? # 幀速率: 30
print('大?。?#39;,size) # 大?。?(512, 512)
success,frame=bga.read()? # 讀取第一幀作為開始
print(success)? # True
print(type(frame)) # <class 'numpy.ndarray'>
while success: ? ? ? ? ? ? ? ? ? ? ? # 循環(huán)讀視頻幀,直到視頻結(jié)束,用True代替會(huì)在播放完畢后報(bào)錯(cuò)
? cv.imshow('BGA',frame) ? ? ? ? ? ? #在'BGA'窗口中顯示幀圖像
? success,frame=bga.read() ? ? ? ? ? ? ? #讀下一幀
? key=cv.waitKey(fps) ? ? ? ?????????????????????#設(shè)定了刷新率,決定了視頻時(shí)長(zhǎng)和速度 單位為毫秒
? if key==27: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #按【Esc】鍵結(jié)束播放
? ? ? break
bga.release() ? ? ? ? ? ? ? ? ? ? ? ? ?? #播放完畢自動(dòng)關(guān)閉視頻,點(diǎn)擊X關(guān)掉的是一幀幀圖像
fps和size都不能帶小數(shù)點(diǎn),所以需要int()轉(zhuǎn)化為整數(shù)
經(jīng)測(cè)試如果設(shè)定尺寸和原視頻不一樣,或大或小都無(wú)法播放
success是布爾類型,如果有讀取到幀返回True,沒讀取到幀返回False
frame是的值是一個(gè)NumPy數(shù)組,也就是一幀的圖像信息

[拖動(dòng)窗口時(shí)播放會(huì)暫停,松開會(huì)從暫停處開始繼續(xù)播放,直至最后一幀]
讀取顯示并寫入視頻
只需要在上面代碼的基礎(chǔ)上加上紅色代碼即可
import CV2 as cv
bga=cv.VideoCapture('star.mpg')
fps=int(bga.get(cv.CAP_PROP_FPS))
size=(int(bga.get(cv.CAP_PROP_FRAME_HEIGHT)),int(bga.get(cv.CAP_PROP_FRAME_WIDTH)))
success,frame=bga.read()
while success:
? vw.write(frame)??????????????????? ??? ??? ?#將幀寫入文件
? cv.imshow('BGA',frame)
? success,frame=bga.read()
? key=cv.waitKey(fps)
? if key==27:
? ? ? break
bga.release()
提前按Esc終止播放寫入的視頻會(huì)截止到終止播放時(shí)刻
寫入視頻的幀率和設(shè)定的fps參數(shù)值有關(guān),和播放幀率無(wú)關(guān)

常用的解碼器格式:
XVID的MPEG-1編碼格式,視頻文件擴(kuò)展名為.avi
cv.VideoWriter_fourcc('P','I','M','1')
Microsoft的MPEG-4編碼格式,視頻文件擴(kuò)展名為.avi
cv.VideoWriter_fourcc('M','P','4','2')?
XVID的MPEG-4編碼格式,視頻文件擴(kuò)展名為.avi
cv.VideoWriter_fourcc('X','V','I','D')
XVID的MPEG-4編碼格式,視頻文件擴(kuò)展名為.flv
cv.VideoWriter_fourcc('F','L','V','1')
總結(jié):
讀取并顯示視頻:
創(chuàng)建VideoCapture對(duì)象
???=cv.VideoCapture('XXX.xxx')
用VideoCapture對(duì)象read()方法獲取視頻中的幀
B,F=???.read()
調(diào)用cv.imshow()函數(shù)在窗口中顯示幀圖像
cv.imshow('窗口名',F)
讀取并轉(zhuǎn)存視頻:
創(chuàng)建VideoWriter對(duì)象,參數(shù)都不能省略
???=cv.VideoWriter('XXX.xxx',cv.解碼器格式,fps,size)
用VideoCapture對(duì)象read()方法獲取視頻中的幀
B,F=???.read()
用VideoWriter對(duì)象write()方法把讀取到的幀寫入文件
???.write(F)

本文章出現(xiàn)的視頻源自BOFXVII比賽中的《Firmament Star》