# Opencv 視訊資料讀取筆記 cv2.VideoCapture()
###### tags: `opencv` `cv2.VideoCapture`
`cv2.VideoCapture()` 是 OpenCV 中用來捕捉視訊的函式,可以讓使用者從不同的來源讀取視訊數據,例如從本機文件、網路串流或者網路攝影機等。
`cv2.VideoCapture()` 函式的常用參數如下:
`device`:指定網路攝影機(WebCamera)的設備編號,默認值為0,代表系統默認網路攝影機。
`filename`:指定要讀取的視訊文件的路徑和文件名稱。
`apiPreference`:指定讀取視訊的API類型,有不同的API可選。
使用 `cv2.VideoCapture()` 函式讀取視訊數據,一般步驟如下:
建立 `cv2.VideoCapture()` 物件。
使用 `read()` 方法讀取視訊幀。
使用 `imshow()` 方法顯示視訊幀。
使用 `release()` 方法釋放資源。
### 讀取影片
下面是使用 `cv2.VideoCapture()` 函式讀取本地文件、網路攝影機、網路串流視訊的範例程式碼:
```python=
import cv2
# 從本地文件讀取視訊
cap = cv2.VideoCapture('test.avi')
# 從網路攝影機讀取視訊
cap = cv2.VideoCapture(0)
# 從網路串流讀取視訊(RTSP )
url = 'rtsp://xxx.xxx.xxx.xxx:xxxx/stream'
cap = cv2.VideoCapture(url)
# 持續讀取視訊數據
while True:
# 從 cap1 讀取一幀視訊數據
ret, frame = cap.read()
# 顯示視訊
cv2.imshow('video', frame)
# 按 'q' 鍵退出
key = cv2.waitKey(0) & 0xFF
if key == ord('q'):
break
# 釋放資源
cap1.release()
# 關閉視窗
cv2.destroyAllWindows()
```
在上面的範例程式碼中,使用 `cv2.VideoCapture()`函式從本地文件和網路攝影機讀取視訊數據,並持續讀取並顯示視訊數據,直到按下 'q' 鍵退出。
其中,`cv2.VideoCapture(0)` 會使用預設網路攝影機來捕獲視訊,當系統有多個網路攝影機時,可以根據實際情況指定 0、1 等設備編號來選擇使用哪個
- `cv2.waitKey(0) & 0xFF`
在 Python 中,0xFF 是一個十六進制的數值,其二進制表示為 11111111。它通常用於將一個整數值限制在 8 位(即 0 到 255 的範圍內)。在使用 OpenCV 的 cv2.waitKey() 方法時,0xFF 通常用作一個掩碼,以便確保按下按鍵時,只取回返回值的最後 8 位(即 ASCII 碼值)。這是因為 cv2.waitKey() 方法返回的值包含許多其他的控制按鍵(例如上下左右鍵、功能鍵等)。
### 保存/寫入影片
在使用 cv2.VideoWriter 寫入影片時,需要指定編碼器和影片的幀率、大小等參數。其中,編碼器可以使用 FourCC 代碼來表示,FourCC 全稱為 Four Character Code,它是一個四字元的代碼,用於表示壓縮格式。
在 OpenCV 中,可以使用 cv2.VideoWriter_fourcc() 函式來創建 FourCC 代碼。常用的編碼器及其 FourCC 代碼如下:
- MPEG-4: ('X','V','I','D')或('XVID')、或使用( 'M','P','4','V')、(*'mp4v')
- H.264: ('A','V','C','1')或('AVC1')
- WMV1: ('W','M','V','1')或('WMV1')
- VP8: ('V','P','8','0')或('VP80')
例如,以下程式碼示範如何使用 cv2.VideoWriter 使用 H.264 編碼器的影片:
```python=
import cv2
# 創建 VideoCapture 物件
cap = cv2.VideoCapture(0)
# 獲取視訊的幀率、寬度和高度
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 寫入 MPEG-4.2 編碼
fourcc = cv2.VideoWriter_fourcc(*'avc1')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))
# 寫入視訊數據
while cap.isOpened():
ret, frame = cap.read()
if ret:
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 釋放資源
cap.release()
out.release()
cv2.destroyAllWindows()
```
在上述程式碼中,我們使用 'avc1' 作為 cv2.VideoWriter_fourcc() 的參數,指定使用 H.264 編碼器進行視訊編碼。這裡也可以使用其他的編碼器代碼,例如 'H264'。
## Reference
- 2017.11 [OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學](https://blog.gtwang.org/programming/opencv-webcam-video-capture-and-file-write-tutorial/)
- 2021.04 [Python-OpenCV — 讀取顯示及儲存影像、影片](https://medium.com/ching-i/python-opencv-%E8%AE%80%E5%8F%96%E9%A1%AF%E7%A4%BA%E5%8F%8A%E5%84%B2%E5%AD%98%E5%BD%B1%E5%83%8F-%E5%BD%B1%E7%89%87-ee3701c454da)
### OPENCV官方文件與範例
https://docs.opencv.org/4.x/dd/d43/tutorial_py_video_display.html