天天看點

放棄C++,為什麼我要安利Python來開發OpenCV?!

1、目标

  • 打開攝像頭并捕獲照片
  • 播放本地視訊,錄制視訊
  • OpenCV函數:cv2.VideoCapture(), cv2.VideoWriter()

2、打開攝像頭

要使用攝像頭,需要使用cv2.VideoCapture(0)建立VideoCapture對象,參數0指的是攝像頭的編号,如果你電腦上有兩個攝像頭的話,通路第2個攝像頭就可以傳入1,依此類推。

放棄C++,為什麼我要安利Python來開發OpenCV?!

capture.read()函數傳回的第1個參數ret(return value縮寫)是一個布爾值,表示目前這一幀是否擷取正确。cv2.cvtColor()用來轉換顔色,這裡将彩色圖轉成灰階圖。

另外,通過cap.get(propId)可以擷取攝像頭的一些屬性,比如捕獲的分辨率,亮度和對比度等。propId是從0~18的數字,代表不同的屬性,完整的屬性清單可以參考:VideoCaptureProperties(

http://t.cn/E5Zj6ZD

)。也可以使用cap.set(propId,value)來修改屬性值。比如說,我們在while之前添加下面的代碼:

放棄C++,為什麼我要安利Python來開發OpenCV?!

經驗之談:某些攝像頭設定分辨率等參數時會無效,因為它有固定的分辨率大小支援,一般可在攝像頭的資料頁中找到。

3、播放本地視訊

跟打開攝像頭一樣,如果把攝像頭的編号換成視訊的路徑就可以播放本地視訊了。回想一下cv2.waitKey(),它的參數表示暫停時間,是以這個值越大,視訊播放速度越慢,反之,播放速度越快,通常設定為25或30。

放棄C++,為什麼我要安利Python來開發OpenCV?!

4、錄制視訊

之前我們儲存圖檔用的是cv2.imwrite(),要儲存視訊,我們需要建立一個VideoWriter的對象,需要給它傳入四個參數:

  • 輸出的檔案名,如’output.avi’
  • 編碼方式FourCC碼
  • 幀率FPS
  • 要儲存的分辨率大小

FourCC是用來指定視訊編碼方式的四位元組碼,所有的編碼可參考Video Codecs。如MJPG編碼可以這樣寫:

cv2.VideoWriter_fourcc(*'MJPG')或cv2.VideoWriter_fourcc('M','J','P','G')           
放棄C++,為什麼我要安利Python來開發OpenCV?!

6、小結

使用cv2.VideoCapture()建立視訊對象,然後在循環中一幀幀顯示圖像。參數傳入數字時,代表打開攝像頭,傳入本地視訊路徑時,表示播放本地視訊。

cap.get(propId)擷取視訊屬性,cap.set(propId,value)設定視訊屬性。

cv2.VideoWriter()建立視訊寫入對象,用來錄制、儲存視訊

7、練習

請先閱讀番外篇,然後實作一個可以拖動滑塊播放視訊的功能。(提示:需要用到 cv2.CAP_PROP_FRAME_COUNT和cv2.CAP_PROP_POS_FRAMES兩個屬性)。

引用

本節源碼

http://t.cn/E5ZRJDg

Video Codecs by FOURCC

http://t.cn/zOz0KsY

Getting Started with Videos

http://t.cn/E5Z3uHM