首頁 > 軟體

Python OpenCV視訊檔相關操作教學

2022-11-11 14:00:48

一、從檔案中讀取視訊並播放

1.建立讀取視訊的物件

cap=cv.VideoCapture(filepath)

2.獲取視訊某些屬性

retval=cap.get(propId)

propId:從0到18的數位,每個數位表示視訊的屬性

索引flags意義
0cv2.CAP_ PROP_POS_MSEC視訊檔當前位置
1cv2.CAP_PROP_POS_FRAMES從0開始索引幀,幀位置
2cv2.CAP_PROP_POS_AVI_RATIO視訊檔的相對位置(0表示開始,1表示結束)
3cv2.CAP_PROP_FRAME_WIDTH視訊流的幀寬度
4cv2.CAP_PROP_FRAME_HEIGHT視訊流的幀高度
5cv2.CAP_PROP_FPS影格率
6cv2.CAP_PROP_FOURCC編解碼器四字元程式碼
7cv2.CAP_PROP_FRAME_COUNT視訊檔的幀

3.修改視訊屬性資訊

cap.set(propId,value)

4.判斷影象是否讀取成功

isornot=cap.isOpened()

5.獲取視訊的一幀影象

ret,frame=cap.read()

ret:獲取成功返回True,失敗返回False

frame:獲取到的影象

注意:呼叫cv.imshow()顯示影象時,要使用cv.waitkey()設定適當持續時間,通常設定25ms

6.釋放影象

cap.release()

範例:

import numpy as np
import cv2 as cv
cap=cv.VideoCapture("video.mp4")
#判斷是否獲取成功
while(cap.isOpened()):
    #獲取每一幀影象
    ret,frame=cap.read()
    #是否獲取成功
    if ret == True:
        cv.imshow("frame",frame)
    if cv.waitKey(25)&0xFF==ord("q"):
        break;
cap.release()
cv.destoryAllWindows()

 二、視訊檔的儲存

1.在OpenCV中儲存視訊使用的是VedioWriter物件,建立視訊寫入物件

out=cv.VideoWriter(filename,fourcc,fps,framesize)

fourcc:用四個字元表示的視訊編碼格式

fps:幀速率

framesize:每一幀的大小

2.設定視訊的編解碼器

retval=cv2.VideoWriter_fourcc(c1,c2,c3,c4)

c1~c4:視訊編解碼器的4位元組程式碼,常用的有:

Windows:DIVX(.avi)

OS中:MJPG(.mp4),DIVX(.avi),X264(.mkv)

3.利用cap.read()獲取視訊中的每一幀影象,使用out.write()將某一幀影象寫入視訊中

4.使用cap.release()和out.release()釋放資源

範例

import numpy as np
import cv2 as cv
#讀取視訊
cap=cv.VideoCapture("video.mp4")
width=int(cap.get(3))
height=int(cap.get(4))
out=cv.VideoWriter("out.avi",cv.VideoWriter_fourcc("M","J","P","G"),10,(width,height))
while(True):
    ret,frame=cap.read()
    if ret==True:
        out.write(frame)
    else:
        break
cap.release()
out.release()
cv.destroyAllWindows()

 三、視訊檔目標追蹤

1.meanshift演演算法:

1>原理:通常情況,使用直方圖反向投影方法將視窗移動到反向投影影象中灰度密度最大的區域

假設我們有張100x100的輸入影象,有一張10x10的模板影象, 查詢的過程:
1.從輸入影象的左上角(0,0)開始,切割一塊(0,0)至(10,10)的臨時影象

2.生成臨時影象的直方圖
3.用臨時影象的直方圖和模板影象的直方圖對比,對比結果記為c
4.直方圖對比結果c,就是結果影象(0,0)處的畫素值
5.切割輸入影象從(0,1)至(10,11)的臨時影象,對比直方圖,並記錄到結果影象

6.重複1~5步直到輸入影象的右下角,就形成了直方圖的反向投影

2>API

cv.meanshift(probImage,window,criteria)

probImage:ROI區域,即直方圖的反向投影

window:初始搜尋視窗,即定義ROI的rect

criteria:確定視窗搜尋停止的準則,主要有迭代次數達到設定的最大值,視窗中心漂移值大於某個設定的限值

3>主要流程

1.讀取視訊檔: cv.VideoCapture0
2.感興趣區域設定:獲取第一幀影象,並設定目標區域,即感興趣區域
3.計算直方圖:計算感興趣區域的HSV直方圖,並進行歸一化
4.目標追蹤:設定視窗搜尋停止條件,直方圖反向投影,進行目標追蹤,並在目標位置繪製矩形框。

範例

import numpy as np
import cv2 as cv
# 1.獲取影象
cap=cv.VideoCapture('video.mp4')
#指定追蹤目標
ret,frame=cap.read()
#行、高、列、寬
r,h,c,w=347, 301, 700, 308
win=(c,r,w,h)#追蹤視窗為列行寬高
#追蹤目標
roi = frame[r:r + h, c:c + w]
#計算直方圖(HSV)
hsv_roi=cv.cvtColor(roi, cv.COLOR_BGR2HSV)
roi_hist=cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
# 4. 目標追蹤,設定視窗搜尋終止條件:最大迭代次數,視窗中心漂移最小值
term=(cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT, 10, 1)
while (True):
    ret, frame=cap.read()
    if ret == True:
        #計算直方圖的反向投影
        hsv=cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        dst=cv.calcBackProject([hsv],[0],roi_hist,[0, 180],1)
        #進行meanshift追蹤
        ret,win = cv.meanShift(dst,win,term)
        #追蹤的位置繪製在視訊上
        x,y,w,h=win
        img2 = cv.rectangle(frame, (x,y), (x+w, y+h), 255, 2)
        cv.imshow('frame',img2)
        if cv.waitKey(60) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
cv.destroyAllWindows()

總結 

到此這篇關於Python OpenCV視訊檔相關操作的文章就介紹到這了,更多相關OpenCV視訊檔操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com