【第二節(jié)】OpenCV視頻處理
目標
1、 用攝像頭捕獲視頻
我們經(jīng)常需要使用攝像頭捕獲實時圖像。OpenCV 為這中應(yīng)用提供了一個非常簡單的接口。讓我們使用攝像頭來捕獲一段視頻,并把它轉(zhuǎn)換成灰度視頻顯示出來。從這個簡單的任務(wù)開始吧。為了獲取視頻,你應(yīng)該創(chuàng)建一個VideoCapture對象。他的參數(shù)可以是設(shè)備的索引號,或者是一個視頻文件。設(shè)備索引號就是在指定要使用的攝像頭。一般的筆記本電腦都有內(nèi)置攝像頭。所以參數(shù)就是0。你可以通過設(shè)置成1或者其他的來選擇別的攝像頭。之后,你就可以一幀一幀的捕獲視頻了。但是最后,別忘了停止捕獲視頻。
????????cap.read()返回一個布爾值( True/False )。如果幀讀取的是正確的,就是True。所以最后你可以通過檢查他的返回值來查看視頻文件是否已經(jīng)到了結(jié)尾。
????????有時cap可能不能成功的初始化攝像頭設(shè)備。這種情況下上面的代碼會報錯。你可以使用cap.isOpened(),來檢查是否成功初始化了。如果返回值是;True,那就沒有問題。否則就要使用函數(shù)cap.open()。
????????你可以使用函數(shù)cap.get(propId)來獲得視頻的一些參數(shù)信息。這里propId可以是0到18之間的任何整數(shù)。每-個數(shù)代表視頻的-一個屬性,見下表
????????其中的一些值可以使用cap.set(propId,value) 來修改,value就是你想要設(shè)置成的新值。
例如,我可以使用cap.get(3)和cap.get(4)來查看每- -幀的寬和高。默認情況下得到的值是640X480。但是我可以使用ret=cap.set(3,320)和ret=cap.set(4,240)來把寬和高改成320X240。
注意:本程序是在windows 7環(huán)境下運行,其他系統(tǒng)需要修改參數(shù)。
2、播放視頻
????????與從攝像頭中捕獲一樣,你只需要把設(shè)備索引號改成視頻文件的名字。在播放每-幀時,使用CV2.waiKey()設(shè)置適當?shù)某掷m(xù)時間。如果設(shè)置的太低視頻就會播放的非???,如果設(shè)置的太高就會播放的很慢(你可以使用這種方法控制視頻的播放速度)。通常情況下25毫秒就可以了。
3、保存視頻
????????在我們捕獲視頻,并對每-幀都進行加工之后我們想要保存這個視頻。對于圖片來時很簡單只需要使用CV2.imwrite()。但對于視頻來說就要多做點工作。
????????這次我們要創(chuàng)建一個VideoWriter的對象。我們應(yīng)該確定一個輸出文件的名字。接下來指定FourCC編碼(下面會介紹)。播放頻率和幀的大小也都需要確定。最后一個是isColor標簽。如果是True,每一幀就是彩色圖,否則就是灰度圖。
?????????FourCC就是一個4字節(jié)碼,用來確定視頻的編碼格式??捎玫木幋a列表可以從fourcc.org查到。這是平臺依賴的。下面這些編碼器對我來說是有用個。.
????????●In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. ??????????????????MJPG results in high size video. X264 givesvery small size video)
????????●In Windows: DIVX (More to be tested and added)
????????●In OSX : (I don't have access to OSX. Can some one fll this?)
FourCC碼以下面的格式傳給程序,以MJPG為例:
????????CV2.cv.FOURCC(M',J,'P';,'G)或者CV2.cv.FOURCC(*'MJPG')。
下面的代碼是從攝像頭中捕獲視頻,沿水平方向翻轉(zhuǎn)(鏡面效果)每一幀并保存它。
注意:于openCV3的主體實在openCV2的基礎(chǔ)上進行的修改,部分openCV2的程序仍然可以在openCV3下運行。但是openCV3也做了部分的修改。其中Videowriter中的fourcc,CV2.x版本中中形式為CV2.cv.fourcc,在CV3,0以上的版本中應(yīng)為CV2.VideoWriter_fourcc,需要特別注意。?
攝像頭不方便截圖,大家在使用時,有問題可以留言談?wù)摗?/p>