OpenCV_Python官方文檔2——視頻操作

OpenCV-Python Tutorials

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

視頻捕獲

Capture Video from Camera

主要函數

  1. cv2.VideoCapture()

通過攝像頭捕獲實時圖像數據。共一個參數,參數表示攝像頭索引號,0:默認筆記本內置攝像頭,或者填寫視頻名稱,直接加載本地視頻文件

  1. cap.isOpened()

返回一個布爾值(True / False)。有時,cap 可能沒有初始化捕捉器,在這種情況下代碼就會出錯。該函數用來檢查捕捉器是否初始化,如果打開了它會返回 True 。否則用 cap.open() 手動打開。但是一般情況下 cap 沒有初始化都是視頻文件沒有正確傳入導致的,在這種情況下請檢查文件路徑或者攝像頭索引是否正確。

  1. ret,frame = cap.read()

返回兩個值,ret 存儲布爾值,如果視頻讀取正確,則爲 True,如果錯誤,則爲 False,也可用來判斷是否到視頻結尾;frame 存儲每一幀的圖像。若使用一個變量來接收兩個值,如frame = cap.read(),則 frame 爲一個元組,原來使用 frame 處需更改爲 frame[1]

  1. cap.get(propid)

獲得視頻的某些參數。propid 指屬性id,可以是 0 到 18 之間的任何整數。每一個數字代表視頻的一個屬性,其中的一些值可以使用 cap.set(propid,value) 來修改,value 就是你想要設置成的新的值。
例如,可以使用 cap.get(3) 和 cap.get(4) 來查看每一幀的寬和高,默認爲 640* 480。如果想把寬和高修改爲 320*240,可以使用 cap.set(3,320) 和cap.set(4,240) 。
在這裏插入圖片描述

  1. cap.release():釋放攝像頭

創建了一個 VideoCapture 對象來捕獲視頻,視頻源爲當前電腦攝像頭。

import numpy as np 
import cv2

cap = cv2.VideoCapture(0)
while(cap.isOpened()): #反覆讀取我們捕獲到的視頻幀
    ret, frame = cap.read() #從攝像頭讀取一幀,ret表示視頻讀取成功與否
    if ret:
        frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #對捕捉到的視頻幀進行處理
        cv2.imshow('frame',frame) #顯示
    else:
        break
        
    #控制視頻播放速度
    k = cv2.waitKey(1) & 0xFF #每幀數據延時 1ms,延時不能爲 0,否則讀取的結果是靜態幀
    if  k == ord('s'):  #按s鍵,打印字符串
        print(cap.get(3));
        print(cap.get(4));
    elif k == ord('q'):  # 按q鍵退出
        break 

cap.release() #釋放攝像頭
cv2.destroyAllWindows() #關閉所有窗口

k = cv2.waitKey(1) & 0xFF,該代碼的作用爲控制視頻播放速度。如果這段代碼,視頻播放速度比它原來的速度快很多,幾乎是好幾倍的播放速度。因爲每一幀都是靜止的圖象,用while 循環來讀取視頻幀,快速連續地顯示幀便形成了運動的假象。而cv2.waitKey(value)在這裏的作用是等待 value 毫秒然後執行下一個循環,也就是每個循環展示一副畫面 value 毫秒。注意。這裏的 value 跟視頻的 fps 不是一個概念,fps是一秒內播放幾幀畫面,而 value 是顯示一幅圖 value 毫秒,可以理解爲fps = 1000/value。我們可以用 cap.get(5) 獲取視頻原本的 fps,例如視頻的 fps 爲 30,那麼 value 的值可以取 1000/30 = 33,這樣視頻的播放速度就與原本的播放速度大致相同了。

注意:標準的幀速率:29.97,23.976 ,14.99;近似30,24,15;

爲什麼標準的是29.97 ,請參考這裏
https://zhidao.baidu.com/question/79941514.html?qbl=relate_question_2&word=��������Ƶ��30֡��

Playing Video from file

和從攝像頭中讀取視頻一樣,從文件中讀取視頻只需要把攝像頭索引換成文件名。

cap = cv2.VideoCapture('frame.avi')

Saving a Video

主要函數
  1. cv2.VideoWriter()

保存視頻的方式與圖片不同,創建一個cv2.VideoWriter的對象,參數依次爲視頻文件名(如output.avi),視頻編碼格式(FourCC編碼),幀率(fps),視頻幀的大小(寬和高),是否彩色。最後一個參數是一個 isColor 標誌位,如果它爲 true 就輸出彩色圖像,否則輸出灰度圖像。

FourCC編碼是一個4個字節的編碼用來指定視頻的視頻的編碼格式。在Windows平臺下主要的視頻格式是DIVX,它支持 MPEG-4, H.264 和最新 H.265 標準的視頻,分辨率可高達4K超高清。

以XVID 爲例:cv2.VideoWriter_fourcc(‘X’,’V’,’I’,’D’) 或者cv2.VideoWriter_fourcc(*’XVID’)傳遞 FourCC碼。

  1. cv2.flip()

該函數用來翻轉一幀圖像,共兩個參數,第一個參數是要翻轉的圖像,第二個參數是翻轉的模式(0代表沿 x 軸翻轉,整數(比如1)代表沿 y 軸翻轉,負數代表沿兩個座標軸同時翻轉)。

  1. outWriter.write()

函數接收一張圖片並把它寫到指定的位置,這裏指定的位置就是創建VideoWriter對象outWriter。

捕捉攝像頭視頻,將其每一幀沿 x 軸方向翻轉,然後保存。

import numpy as np 
import cv2

cap = cv2.VideoCapture(0) #從攝像頭獲取視頻
fourcc = cv2.VideoWriter_fourcc(*'XVID') #視頻編碼格式
outWriter = cv2.VideoWriter('frame.avi',fourcc,24,(640,480)) #創建VideoWriter對象

while(cap.isOpened()):
    ret, frame = cap.read() 
    if ret:
        frame = cv2.flip(frame,0) #處理得到的幀,沿x軸翻轉
        outWriter.write(frame) #保存翻轉後的視頻幀
        cv2.imshow('frame',frame)
    else:
        break
        
    #控制視頻播放速度
    k = cv2.waitKey(1) & 0xFF
    if  k == ord('s'):  #按s鍵,打印字符串
        print(cap.get(3));
        print(cap.get(4));
    elif k == ord('q'):  # 按q鍵退出
        break 
        
#釋放
cap.release()
outWriter.release()
cv2.destroyAllWindows()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章