一、基本概念
cv2.videocapture作為opencv中常用的視頻讀取函數,其主要作用是從本地或者網絡中讀取視頻幀,並預存儲到內存中,便於圖片處理或者特徵提取等操作。其主要參數為視頻文件地址,也可以通過網絡流等方式獲取。使用該函數可以實現對視頻流的不斷讀取,常用於計算機視覺、機器學習等領域。
二、參數介紹
1、讀取本地視頻文件
import cv2
cap = cv2.VideoCapture('./test.mp4') #參數為本地視頻文件名
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
該代碼片段實現了讀取本地視頻文件的功能。其中第一個參數為視頻文件路徑,第二個參數為標誌符,如果標誌符為 True,則表示 Cap 已經初始化成功,否則表示失敗。cap.read()方法作用是從此文件中讀取讀取一幀視頻,並存儲到內存中。cv2.imshow()方法用於顯示讀取的幀。
2、讀取網絡視頻流
import cv2
cap = cv2.VideoCapture('https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4') #參數為網絡視頻地址
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('network video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
該代碼片段實現了讀取網絡視頻流的功能。其中參數為網絡視頻的地址,讀取過程與讀取本地視頻類似。需要注意的是,在讀取網絡視頻時,需要保證網絡帶寬足夠,否則視頻可能會出現卡頓、延遲等情況。同時,如果視頻是rtsp格式,需要將網絡地址修改為rtsp協議。
3、設置幀率和分辨率
import cv2
cap = cv2.VideoCapture('./test.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)#獲取幀率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)#獲取分辨率
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
使用cv2.CAP_PROP_FPS和cv2.CAP_PROP_FRAME_WIDTH、cv2.CAP_PROP_FRAME_HEIGHT可以獲取視頻的幀率、分辨率等關鍵參數。幀率指視頻播放的速度,分辨率指視頻的尺寸大小。可以根據視頻的具體情況,適當進行調整,以提高視頻播放的效果。
4、設置讀取時間和幀數
import cv2
cap = cv2.VideoCapture('./test.mp4')
cap.set(cv2.CAP_PROP_POS_FRAMES, 100)#以幀為單位設置視頻的讀取位置
cap.set(cv2.CAP_PROP_POS_MSEC, 5000)#以毫秒為單位設置視頻的讀取位置
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
cv2.CAP_PROP_POS_FRAMES和cv2.CAP_PROP_POS_MSEC分別表示以幀為單位和毫秒為單位設置視頻的讀取時間和幀數。可以根據具體需要進行設置,在讀取網絡視頻的時候特別需要注意,避免讀取太多數據導致卡頓、延遲等問題。
三、參數優化
1、加速視頻讀取
import cv2
cap = cv2.VideoCapture('./test.mp4')
cap.set(cv2.CAP_PROP_FPS, 60)#設置幀率
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
可以通過提高幀率的方式加速視頻讀取,將幀率設置為更高的數值即可。當然,需要保證計算機的硬件環境足夠強大,否則可能會導致視頻卡頓、延遲等問題。
2、減少讀取時延
import cv2
cap = cv2.VideoCapture('./test.mp4')
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)#設置讀取緩衝區大小
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
可以通過減少讀取緩衝區大小,來減少視頻讀取時延,提高響應速度。需要注意的是,緩衝區過小可能會導致視頻讀取速度不夠,出現卡頓、延遲等問題。
3、數據壓縮和解壓
import cv2
import numpy as np
cap = cv2.VideoCapture('./test.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
frame_compressed = cv2.imencode('.jpg',frame)[1]#將讀取的幀進行壓縮
frame_decompressed = cv2.imdecode(frame_compressed,1)#將壓縮後的幀進行解壓
cv2.imshow('local video',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
可以通過將讀取的幀進行數據壓縮和解壓,從而減少幀數據的大小,提高讀取速度和響應速度。常用的數據壓縮格式有jpeg、png等,可以根據具體需要進行設定。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/239810.html