最近在公司瘋狂做 Demo,最近需要使用 cv2 里的視頻操作,之前一直也沒放在心上,借這次機會好好研究一下吧。
此外,吐槽一句,做 Demo 前最好大家統一一下所用的環境。Opencv-Pyhton 2.x 與 3.x 會存在部分屬性函數名的修改,到時候 debug 就十分的繁瑣。
至于兩者的區別,可以看看文章末尾的參考資料。本文所使用的環境為:Python 2.7, Opencv-Python 3.4.0
目錄
- 獲取并展示視頻
- 保存視頻
- 常用方法
1. 獲取視頻
import
cv2
# 創建 VideoCapture 實例,通過攝像頭獲取視頻,其中,參數 0 表示使用默認攝像頭
cap
=
cv2
.
VideoCapture
(
0
)
# 創建 VideoCapture 實例,通過打開指定視頻文件獲取視頻
# cap = cv2.VideoCapture('out.avi')
# 調用 cap.isOpened() 以確保視頻獲取成功
while
(
cap
.
isOpened
(
)
)
:
ret
,
frame
=
cap
.
read
(
)
# 展示所獲取的視頻
cv2
.
imshow
(
'frame'
,
frame
)
# 等待鍵盤輸入,若傳入參數為 0,則程序將無限制等待用戶的案件事件,否則,程序等待所傳入參數對應的毫秒時間后,跳出循環。
if
cv2
.
waitKey
(
1
)
&
0xFF
==
ord
(
'q'
)
:
break
# 釋放獲取設備
cap
.
release
(
)
# 刪除所有建立的窗口
cv2
.
destroyAllWindows
(
)
2. 保存視頻
import
cv2
cap
=
cv2
.
VideoCapture
(
0
)
# 創建 VideoWrite 實例用于保存視頻,其中,需要指定輸出文件路徑,編碼形式,播放頻率以及幀的Size
# From OpenCV :
# The constructors/functions initialize video writers.
# On Linux FFMPEG is used to write videos; on Windows FFMPEG or VFW is used; on MacOSX QTKit is used.
filePath
=
'example.avi'
fourcc
=
cv2
.
VideoWriter_fourcc
(
*
'XVID'
)
# 創建 VideoWriter 實例
fps
=
cap
.
get
(
cv2
.
cv2
.
CAP_PROP_FPS
)
# 獲取 VideoCapture 的 FPS
frameSize
=
(
cap
.
get
(
cv2
.
CAP_PROP_FRAME_WIDTH
)
,
cap
.
get
(
cv2
.
CAP_PROP_FRAME_HEIGTH
)
)
# 獲取視頻的 VideoCapture 的 Size
out
=
cv2
.
VideoWriter
(
filePath
,
fourcc
,
fps
,
frameSize
)
while
(
cap
.
isOpened
(
)
)
:
ret
,
frame
=
cap
.
read
(
)
out
.
write
(
frame
)
cap
.
release
(
)
# 釋放視頻寫入實例
out
.
release
(
)
cv2
.
destroyAllWindows
(
)
3. 常用方法
retval
=
cv2
.
VideoCapture
.
get
(
propId
)
#打開視頻文件或者相機設備進行視頻捕獲。
propId 常見取值如下
:
(以下為 Opencv
-
Python
3.
x 的格式,在 Opencv
-
Python
2.
x 中,需加上前綴 CV_)
"""
cv2.CAP_PROP_POS_MSEC: 視頻文件的當前位置(ms)
cv2.CAP_PROP_POS_FRAMES: 從0開始索引幀,幀位置。
cv2.CAP_PROP_POS_AVI_RATIO:視頻文件的相對位置(0表示開始,1表示結束)
cv2.CAP_PROP_FRAME_WIDTH: 視頻流的幀寬度。
cv2.CAP_PROP_FRAME_HEIGHT: 視頻流的幀高度。
cv2.CAP_PROP_FPS: 幀率
cv2.CAP_PROP_FOURCC: 編解碼器四字符代碼
cv2.CAP_PROP_FRAME_COUNT: 視頻文件的幀數
cv2.CAP_PROP_FORMAT: retrieve()返回的Mat對象的格式。
cv2.CAP_PROP_MODE: 后端專用的值,指示當前捕獲模式
cv2.CAP_PROP_BRIGHTNESS:圖像的亮度,僅適用于支持的相機
cv2.CAP_PROP_CONTRAST: 圖像對比度,僅適用于相機
cv2.CAP_PROP_SATURATION:圖像飽和度,僅適用于相機
cv2.CAP_PROP_HUE: 圖像色調,僅適用于相機
cv2.CAP_PROP_GAIN: 圖像增益,僅適用于支持的相機
cv2.CAP_PROP_EXPOSURE: 曝光,僅適用于支持的相機
cv2.CAP_PROP_CONVERT_RGB:布爾標志,指示是否應將圖像轉換為RGB。
"""
# grab, retrieve, read 的關系
# Grabs the next frame from video file or capturing device.
retval
=
cv2
.
VideoCapture
.
grab
(
)
# Decodes and returns the grabbed video frame.
retval
,
image
=
cv2
.
VideoCapture
.
retrieve
(
[
,
image
[
,
flag
]
]
)
# Grabs, decodes and returns the next video frame.
retval
,
image
=
cv2
.
VideoCapture
.
read
(
[
,
image
]
)
# 由上可知,read 是 grab 和 retrieve 的結合體。當不需要當前的幀或畫面時,可以使用 grab 跳過,以減少 read 所耗費的額外時間。
參考資料:
- opencv3 與opencv2不同之處
- OpenCV 3.0與OpenCV 2.4的區別
- OpenCV視頻操作
- OpenCV+Python 攝像頭采集代碼
- Python-OpenCV 處理視頻(一)(二): 輸入輸出 視頻處理
- Python&OpenCV - 讀寫(read&write)視頻(video) 詳解及代碼
- OpenCV—Python視頻的讀取及保存
- opencv read grab retrieve 關系
如果你看到了這篇文章的最后,并且覺得有幫助的話,麻煩你花幾秒鐘時間點個贊,或者受累在評論中指出我的錯誤。謝謝!
作者信息:
知乎:沒頭腦
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
