---
# System prepended metadata

title: Opencv 視訊資料讀取筆記 cv2.VideoCapture()
tags: [opencv, cv2.VideoCapture]

---

# 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