视频处理入门 | 六
目標
學習讀取視頻,顯示視頻和保存視頻。
學習從相機捕捉并顯示它。
你將學習以下功能:cv.VideoCapture(),cv.VideoWriter()
從相機中讀取視頻
通常情況下,我們必須用攝像機捕捉實時畫面。提供了一個非常簡單的界面。讓我們從攝像頭捕捉一段視頻(我使用的是我筆記本電腦內(nèi)置的網(wǎng)絡攝像頭) ,將其轉(zhuǎn)換成灰度視頻并顯示出來。只是一個簡單的任務開始。
要捕獲視頻,你需要創(chuàng)建一個?VideoCapture?對象。它的參數(shù)可以是設備索引或視頻文件的名稱。設備索引就是指定哪個攝像頭的數(shù)字。正常情況下,一個攝像頭會被連接(就像我的情況一樣)。所以我簡單地傳0(或-1)。你可以通過傳遞1來選擇第二個相機,以此類推。在此之后,你可以逐幀捕獲。但是在最后,不要忘記釋放俘虜。
import?numpy?as?np import?cv2?as?cv cap?=?cv.VideoCapture(0) if?not?cap.isOpened():print("Cannot?open?camera")exit() while?True:#?逐幀捕獲ret,?frame?=?cap.read()#?如果正確讀取幀,ret為Trueif?not?ret:print("Can't?receive?frame?(stream?end?).?Exiting?...")break#?我們在框架上的操作到這里gray?=?cv.cvtColor(frame,?cv.COLOR_BGR2GRAY)#?顯示結(jié)果幀ecv.imshow('frame',?gray)if?cv.waitKey(1)?==?ord('q'):break #?完成所有操作后,釋放捕獲器 cap.release() cv.destroyAllWindows()cap.read()返回布爾值(True/?False)。如果正確讀取了幀,它將為True。因此,你可以通過檢查此返回值來檢查視頻的結(jié)尾。
有時,cap可能尚未初始化捕獲。在這種情況下,此代碼顯示錯誤。你可以通過cap.isOpened()方法檢查它是否已初始化。如果是True,那么確定。否則,使用cap.open()打開它。
你還可以使用cap.get(propId)方法訪問該視頻的某些功能,其中propId是0到18之間的一個數(shù)字。每個數(shù)字表示視頻的屬性(如果適用于該視頻),并且可以顯示完整的詳細信息在這里看到:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId,value)進行修改。value是你想要的新值。
例如,我可以通過cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)檢查框架的寬度和高度。默認情況下,它的分辨率為640x480。但我想將其修改為320x240。只需使用和即可。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)?and?ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240).
注意
如果出現(xiàn)錯誤,請確保使用任何其他相機應用程序(例如Linux中的Cheese)都可以正常使用相機。
從文件播放視頻
它與從相機捕獲相同,只是用視頻文件名更改攝像機索引。另外,在顯示框架時,請使用適當?shù)臅r間cv.waitKey()。如果太小,則視頻將非常快,而如果太大,則視頻將變得很慢(嗯,這就是顯示慢動作的方式)。正常情況下25毫秒就可以了。
import?numpy?as?np import?cv2?as?cv cap?=?cv.VideoCapture('vtest.avi') while?cap.isOpened():ret,?frame?=?cap.read()#?如果正確讀取幀,ret為Trueif?not?ret:print("Can't?receive?frame?(stream?end?).?Exiting?...")breakgray?=?cv.cvtColor(frame,?cv.COLOR_BGR2GRAY)cv.imshow('frame',?gray)if?cv.waitKey(1)?==?ord('q'):break cap.release() cv.destroyAllWindows()注意
確保安裝了正確的 ffmpeg 或 gstreamer 版本。有時,使用視頻捕獲(Video Capture)是一件令人頭疼的事情,主要原因是錯誤地安裝了 ffmpeg / gstreamer。
保存視頻
所以我們捕捉一個視頻,一幀一幀地處理,我們想要保存這個視頻。對于圖像,它非常簡單,只需使用?cv.imwrite()。這里還需要做一些工作。
這次我們創(chuàng)建一個?VideoWriter?對象。我們應該指定輸出文件名(例如: output.avi)。然后我們應該指定?FourCC?代碼(詳見下一段)。然后傳遞幀率的數(shù)量和幀大小。最后一個是顏色標志。如果為?True,編碼器期望顏色幀,否則它與灰度幀一起工作。
FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定視頻編解碼器的4字節(jié)代碼。可用代碼列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取決于平臺。遵循編解碼器對我來說效果很好。
在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG會生成大尺寸的視頻。X264會生成非常小的尺寸的視頻)
在Windows中:DIVX(尚待測試和添加)
在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
FourCC代碼作為MJPG的cv.VideoWriter_fourcc('M','J','P','G')or?cv.VideoWriter_fourcc(*'MJPG')傳遞。
在從攝像機捕獲的代碼下面,沿垂直方向翻轉(zhuǎn)每一幀并保存。
import?numpy?as?np import?cv2?as?cv cap?=?cv.VideoCapture(0) #?定義編解碼器并創(chuàng)建VideoWriter對象 fourcc?=?cv.VideoWriter_fourcc(*'XVID') out?=?cv.VideoWriter('output.avi',?fourcc,?20.0,?(640,??480)) while?cap.isOpened():ret,?frame?=?cap.read()if?not?ret:print("Can't?receive?frame?(stream?end?).?Exiting?...")breakframe?=?cv.flip(frame,?0)#?寫翻轉(zhuǎn)的框架out.write(frame)cv.imshow('frame',?frame)if?cv.waitKey(1)?==?ord('q'):break #?完成工作后釋放所有內(nèi)容 cap.release() out.release() cv.destroyAllWindows()其他資源
☆☆☆為方便大家查閱,小編已將OpenCV-Python專欄文章統(tǒng)一整理到公眾號底部菜單欄,同步更新中,關(guān)注公眾號,點擊左下方“文章”,如圖:
或點擊下方“閱讀原文”,進入OpenCV-Python專欄,即可查看系列文章。
? ? ?不斷更新資源
? ?? 獲取更多精彩
長按二維碼掃碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的视频处理入门 | 六的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序自动续费
- 下一篇: python 获取当前网页_你好,想知道