读取视频文件python-opencv
由于cv.imread()函數(shù)只能讀取圖像的數(shù)據(jù),不能讀取視頻文件,所以對于數(shù)據(jù)需要從攝像頭加載的要求,需要使用cv.VideoCapture()函數(shù),通過該函數(shù)可以對攝像頭進(jìn)行調(diào)用,并讀取視頻文件數(shù)據(jù)。該函數(shù)是專門用于處理視頻文件讀取。
文章目錄
- 前言
- 二、使用步驟
- 1.代碼展示
- 2.get(propId)函數(shù)
- cv.VideoCapture()函數(shù)調(diào)用攝像頭
前言
cv.VideoCapture()函數(shù),通過該函數(shù)可以對攝像頭進(jìn)行調(diào)用,并讀取視頻文件數(shù)據(jù)。
# 一、cv.VideoCapture()函數(shù)是什么?
從函數(shù)的原型中可以得知,cv.VideoCapture()函數(shù)是用于構(gòu)造一個能夠讀取與處理視頻文件的的視頻對象,并且函數(shù)可以將該視頻對象返回。
<VideoCapture object> = cv.VideoCapture() <VideoCapture object> = cv. VideoCapture(filename, [,apipreference])#filename:讀取的視頻文件名稱。# apipreference:讀取數(shù)據(jù)時設(shè)置的屬性,例如編碼格式、是否調(diào)用OpenNI等函數(shù)的主要作用就是定義一個視頻對象,即默認(rèn)構(gòu)造函數(shù)video = cv.VideoCapture(),通過cv.VideoCapture()函數(shù)僅僅是創(chuàng)建VideoCapture對象video,如果需要具體讀取視頻文件,需要使用該VideoCapture對象的open()函數(shù),通過open()函數(shù)指出視頻文件的路徑以及名稱。
例如video.open(“./videos/test.mp4”)表示video視頻對象讀取在本級文件夾中videos的test.mp4視頻文件,將視頻數(shù)據(jù)返回。而且當(dāng)我們輸入錯誤的視頻文件名稱時,程序不會報錯,而且會繼續(xù)執(zhí)行,但是當(dāng)使用視頻對象變量時,程序?qū)箦e。為了避免這個問題,需要通過VideoCapture對象video中的isOpened()函數(shù)判斷是否成功讀取到視頻文件數(shù)據(jù)。如果讀取成功返回值為True;如果讀取失敗,則返回值為False,
二、使用步驟
1.代碼展示
代碼如下(示例):
import cv2 as cvif __name__ == '__main__':video = cv.VideoCapture()video.open('./video/test.avi')#判斷是否成功創(chuàng)建視頻流while video.isOpened():ret,frame = video.read()print(ret)if ret is True:cv.imshow('video',frame)#設(shè)置播放速速cv.waitKey(int(1000 / video.get(cv.CAP_PROP_FPS)))#按下q鍵退出if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break#輸出相關(guān)參數(shù)信息print('視頻中的圖像寬度{}'.format(video.get(cv.CAP_PROP_FRAME_WIDTH))) print('視頻中的圖像高度{}'.format(video.get(cv.CAP_PROP_FRAME_HEIGHT))) print('視頻幀率{}'.format(video.get(cv.CAP_PROP_FPS))) print('視頻幀數(shù){}'.format(video.get(cv.CAP_PROP_FRAME_COUNT))) #釋放資源并關(guān)閉窗口video.release()cv.destroyAllWindows()cv.VideoCapture()函數(shù)不僅僅可以將讀取讀取的視頻數(shù)據(jù)賦值給申明的變量,而且在讀取文件種類上包含多種格式,例如普通視頻文件(video.avi)、圖像序列或者視頻流的URL。通過cv.VideoCapture()函數(shù)創(chuàng)建一個視頻對象之后,可以利用cv.VideoCapture()對象中的read()函數(shù)讀取一幀圖像,例如ret,frame=video.read(),其中讀取一張圖像的數(shù)據(jù)存放在frame中;ret中存放成功讀取圖片的標(biāo)志位,如果讀取成功,則返回True;若讀取失敗,則返回False。通常,可以利用ret標(biāo)志判斷視頻文件是否到達(dá)了末尾。
2.get(propId)函數(shù)
cv.VideoCapture對象同時可以利用get(propId)函數(shù)來查看視頻的屬性,通過設(shè)定propId獲取不同的視頻屬性,例如視頻的寬度、高度、幀數(shù)等,其取值為0~18的任意整數(shù),如圖2-4所示。Get()方法中propId的可選標(biāo)志。
## 3. get()方法中propId的可選標(biāo)志
| cv.CAP_PROP_POS_MSEC | 0 | 視頻文件的當(dāng)前位置(以毫秒為單位) |
| cv.CAP_PROP_POS_FRAMES | 1 | 下一個被解碼的幀索引,以0為起點(diǎn) |
| cv.CAP_PROP_POS_AVI_RATIO | 2 | 視頻文件的相關(guān)位置,0表示開始,1表示結(jié)束 |
| cv.CAP_PROP_FRAME_WIDTH | 3 | 視頻流中圖像的寬度 |
| cv.CAP_PROP_FRAME_HEIGHT | 4 | 視頻流中圖像的高度 |
| cv.CAP_PROP_FPS | 5 | 視頻流中圖像的幀率(每秒幀數(shù)) |
| cv.CAP_PROP_FOURCC | 6 | 編解碼器的4字符代碼 |
| cv.CAP_PROP_FRAME_COUNT | 7 | 視頻流中的幀數(shù) |
| cv.CAP_PROP_FRAME | 8 | 返回的Mat對象的格式 |
| cv.CAP_PROP_MODE | 9 | 指示當(dāng)前捕捉的模式 |
| cv.CAP_PROP_BRIGHTNESS | 10 | 圖像的亮度(僅相機(jī)) |
| cv.CAP_PROP_CONTRAST | 11 | 圖像的對比度(僅相機(jī)) |
| cv.CAP_PROP_STAURATION | 12 | 圖像飽和度(僅相機(jī)) |
| cv.CAP_PROP_HUE | 13 | 圖像的色相(僅相機(jī)) |
| cv.CAP_PROP_GAIN | 14 | 圖像的增益(僅相機(jī)) |
| cv.CAP_PROP_EXPOSURE | 15 | 曝光(僅相機(jī)) |
| cv.CAP_PROP_CONVERT_RGB | 16 | 布爾值,確定是否應(yīng)該將圖像轉(zhuǎn)換為RGB格式 |
| cv.CAP_PROP_WHITE_BALANCE_BLUE_U | 17 | 白平衡 |
| cv.CAP_PROP_RECTIFCATION | 18 | 立體相機(jī)校正標(biāo)記 |
cv.VideoCapture()函數(shù)調(diào)用攝像頭
cv.VideoCapture()函數(shù)同時也可以通過調(diào)用攝像頭的方式來獲取視頻,其獲取方式與從文件中讀取視頻類似。函數(shù)同樣返回一個視頻對象,只是參數(shù)變成了攝像頭索引。由于攝像頭拍攝的畫面可能與實(shí)際相反,所以為了解決這個問題,將frame中的數(shù)據(jù)進(jìn)行水平翻轉(zhuǎn)處理,即frame=cv.flip(frame,1),實(shí)現(xiàn)了攝像頭拍攝的圖像進(jìn)行翻轉(zhuǎn)。
<VideoCapture object> = cv. VideoCapture(index, [,apipreference])#index:攝像頭索引,參數(shù)0表示使用計算機(jī)默認(rèn)攝像頭,同樣改用其他參數(shù)可以調(diào)用其他攝像頭。# apipreference:讀取數(shù)據(jù)時設(shè)置的屬性,例如編碼格式、是否調(diào)用OpenNI等總結(jié)
以上是生活随笔為你收集整理的读取视频文件python-opencv的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grub4dos linux 设备,解决
- 下一篇: python将数据导入数据库 atomi