基于Python實(shí)現(xiàn)捕獲,播放和保存攝像頭視頻
前幾天有個(gè)讀者在粉絲群里面提了一個(gè)問(wèn)題:
Python 怎樣提高視頻清晰度和對(duì)比度?
我之前沒(méi)有涉及到使用 Python 操作視頻這一方面,所以當(dāng)時(shí)很抱歉地跟讀者朋友說(shuō)暫未涉及。
這兩天想了下,感覺(jué)應(yīng)該補(bǔ)一下這一塊的內(nèi)容,一方面是增加自己涉獵的廣度,另一方面也可以給粉絲答疑解惑。
今天先分享一下 Python 操作視頻最基本的操作,包括讀取和播放視頻和保存視頻。
讀取視頻
要捕獲視頻,你需要?jiǎng)?chuàng)建一個(gè) VideoCapture 對(duì)象。它的參數(shù)可以是設(shè)備索引或視頻文件的名稱(chēng)。所以,我們讀取視頻有兩種方式,分別是從相機(jī)中讀取視頻和從文件中讀取視頻。
從相機(jī)中讀取視頻
對(duì)于有攝像頭的設(shè)備,例如帶攝像頭的筆記本電腦,我們可以直接調(diào)起電腦的攝像頭,讀取攝像頭的視頻流。
import?cv2?as?cv cap?=?cv.VideoCapture(0) if?not?cap.isOpened(): ????print("Cannot?open?camera") ????exit() while?True: ????#?逐幀捕獲 ????ret,?frame?=?cap.read() ????#?如果正確讀取幀,ret為T(mén)rue ????if?not?ret: ????????break ????#?顯示結(jié)果幀 ????cv.imshow('frame',?frame) ????if?cv.waitKey(1)?==?ord('q'): ????????break #?完成所有操作后,釋放捕獲器 cap.release() cv.destroyAllWindows()
這里我向 VideoCapture
對(duì)象傳入了參數(shù) 0
,表示設(shè)備索引,設(shè)備索引就是指定哪個(gè)攝像頭的數(shù)字。正常情況下,一個(gè)攝像頭會(huì)被連接(就像我的情況一樣)。所以我簡(jiǎn)單地傳0。你可以通過(guò)傳遞1來(lái)選擇第二個(gè)相機(jī),以此類(lèi)推。
cap.isOpened()
用來(lái)判斷是否捕獲到視頻。
cap.read()
返回布爾值(True/ False)。如果正確讀取了幀,它將為T(mén)rue。因此,你可以通過(guò)檢查此返回值來(lái)檢查視頻的結(jié)尾。
cv.imshow
方法用來(lái)顯示視頻的幀。我們播放視頻的原理就是逐幀播放。
在最后,不要忘記通過(guò) cap.release()
釋放俘虜。
運(yùn)行這段代碼,你就可以看到一個(gè)彈窗實(shí)時(shí)地播放你電腦攝像頭中的圖像了。
從文件中播放視頻
與從相機(jī)捕獲相同,只是用視頻文件名更改攝像機(jī)索引。
另外,在顯示視頻時(shí),可以通過(guò) cv.waitKey()
來(lái)控制視頻播放的速度。如果設(shè)置太小,則視頻將非常快,相當(dāng)于倍速播放;而如果太大,則視頻將變得很慢,相當(dāng)于延遲播放。正常情況下25毫秒就可以了。
import?cv2?as?cv cap?=?cv.VideoCapture('video.mp4') while?cap.isOpened(): ????ret,?frame?=?cap.read() ????#?如果正確讀取幀,ret為T(mén)rue ????if?not?ret: ????????break ????cv.imshow('frame',?frame) ????if?cv.waitKey(1)?==?ord('q'): ????????break cap.release() cv.destroyAllWindows()
運(yùn)行這段代碼,你就可以看到一個(gè)彈窗播放你選擇的視頻文件了。
保存視頻
從相機(jī)讀取視頻,我們可以將視頻保存到本地。我們捕捉一個(gè)視頻,一幀一幀地處理,如果我們想要保存這個(gè)視頻,非常簡(jiǎn)單,只需使用 cv.VideoWriter()
。
cv.VideoWriter()
有5個(gè)參數(shù):
- 參數(shù)1:輸出文件名,例如: output.mp4。
- 參數(shù)2:FourCC 代碼,F(xiàn)ourCC 是用于指定視頻編解碼器的4字節(jié)代碼。
- 參數(shù)3:幀率的數(shù)量。
- 參數(shù)4:幀大小。
- 參數(shù)5:顏色標(biāo)志。如果為 True,正常顏色輸出,否則就是灰色圖像輸出。
關(guān)于 FourCC
與視頻格式的對(duì)照關(guān)系,我列舉了一些常見(jiàn)的格式:
cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec
cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec --> mp4v
cv2.VideoWriter_fourcc(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec --> avi
cv2.VideoWriter_fourcc(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
cv2.VideoWriter_fourcc(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
保存視頻的代碼:
import?cv2?as?cv cap?=?cv.VideoCapture(0) #?定義編解碼器并創(chuàng)建VideoWriter對(duì)象 fourcc?=?cv.VideoWriter_fourcc(*'MJPG') out?=?cv.VideoWriter('output.mp4',?fourcc,?20.0,?(640,??480)) while?cap.isOpened(): ????ret,?frame?=?cap.read() ????if?not?ret: ????????break ????frame?=?cv.flip(frame,?1) ????#?寫(xiě)翻轉(zhuǎn)的框架 ????out.write(frame) ????cv.imshow('frame',?frame) ????if?cv.waitKey(1)?==?ord('q'): ????????break #?完成工作后釋放所有內(nèi)容 cap.release() out.release() cv.destroyAllWindows()
運(yùn)行這段代碼,你就可以在代碼目錄下找到一個(gè) output.mp4
的視頻文件了。
上面幾段代碼中,如果想要退出視頻操作,敲擊鍵盤(pán)的 q
就可以。
到此這篇關(guān)于基于Python實(shí)現(xiàn)捕獲,播放和保存攝像頭視頻的文章就介紹到這了,更多相關(guān)Python攝像頭視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)從任意長(zhǎng)度的可迭代對(duì)象中分解元素操作示例
這篇文章主要介紹了Python 數(shù)據(jù)結(jié)構(gòu)與算法 從任意長(zhǎng)度的可迭代象中分解元素操作,結(jié)合實(shí)例形式分析了Python使用*表達(dá)式針對(duì)可迭代對(duì)象的分解操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02Python+Flask編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API
Flask是一個(gè)微型的Python開(kāi)發(fā)的Web框架,基于Werkzeug WSGI工具箱和Jinja2模板引擎。本文將利用Flask框子編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API,感興趣的可以了解一下2022-03-03Python中的引用知識(shí)點(diǎn)總結(jié)
在本文里我們給大家整理了關(guān)于Python中的引用知識(shí)點(diǎn)以及相關(guān)代碼總結(jié),需要的朋友們跟著學(xué)習(xí)下。2019-05-05Python的NumPy使用之?dāng)?shù)組過(guò)濾
這篇文章主要介紹了Python的NumPy使用之?dāng)?shù)組過(guò)濾,在 NumPy中,我們使用布爾索引列表來(lái)過(guò)濾數(shù)組布爾索引列表是與數(shù)組中的索引相對(duì)應(yīng)的布爾值列表,需要的朋友可以參考下2023-07-07python?Django實(shí)現(xiàn)增刪改查實(shí)戰(zhàn)代碼
這篇文章主要介紹了python?Django增刪改查快速體驗(yàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02關(guān)于python變量的引用以及在底層存儲(chǔ)原理
Python的變量,簡(jiǎn)單來(lái)說(shuō)有數(shù)值型,布爾型,字符串類(lèi)型,列表,元組,字典等6大類(lèi)。那么不同變量類(lèi)型在底層是如何存儲(chǔ)的,關(guān)系到變量的引用,能否正確的掌握變量的相關(guān)操作?接下來(lái)小編就來(lái)為大家講解python變量的引用以及在底層存儲(chǔ)原理,需要的朋友可以參考一下2021-09-09Python jieba庫(kù)分詞模式實(shí)例用法
在本篇文章里小編給大家分享的是一篇關(guān)于Python jieba庫(kù)分詞模式實(shí)例用法,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01解決python3 網(wǎng)絡(luò)請(qǐng)求路徑包含中文的問(wèn)題
今天小編就為大家分享一篇解決python3 網(wǎng)絡(luò)請(qǐng)求路徑包含中文的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python golang中g(shù)rpc 使用示例代碼詳解
這篇文章主要介紹了python golang中g(shù)rpc 使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06