해상도, FPS, 포맷 설정까지: VideoCapture 속성 완전 정리

대상: OpenCV로 카메라 영상을 다루며 해상도, FPS, 포맷 설정에 어려움을 겪는 개발자
환경: Ubuntu 22.04 / Python 3.10 / OpenCV 4.x


1. 문제/주제 요약

OpenCV의 cv2.VideoCapture()를 이용해 카메라를 제어할 때,

  • 해상도(CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT)
  • FPS(CAP_PROP_FPS)
  • 포맷(CAP_PROP_FOURCC)

같은 속성을 설정해도 실제 카메라가 그대로 적용되지 않는 경우가 많습니다.

이 글에서는 OpenCV에서 VideoCapture 속성을 정확히 제어하는 방법을 단계별로 정리합니다.


2. 원인/배경 설명

cv2.VideoCapture는 내부적으로 OS와 드라이버를 통해 카메라를 제어합니다.
하지만 다음 이유로 설정이 반영되지 않을 수 있습니다:

  • 카메라 드라이버에서 해당 해상도/FPS를 지원하지 않음
  • 백엔드(Backend) 선택 문제 (V4L2, GStreamer, DirectShow 등)
  • 설정 순서 문제 (캡처 시작 후 설정 시 무시됨)

따라서 단순히 cap.set()을 호출하는 것만으로는 원하는 결과가 나오지 않을 수 있습니다.


3. 설정 순서 및 예제 코드

(1) 기본 구조

import cv2

# 0은 기본 카메라 장치 인덱스
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)  # Ubuntu에서는 V4L2 백엔드 권장

if not cap.isOpened():
    print("카메라를 열 수 없습니다.")
    exit()

# 원하는 속성 설정
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 30)

# FOURCC 설정 (포맷)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')  # 또는 'YUYV', 'XVID'
cap.set(cv2.CAP_PROP_FOURCC, fourcc)

# 실제 적용된 속성 확인
print("Width :", cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print("Height:", cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("FPS   :", cap.get(cv2.CAP_PROP_FPS))
print("FOURCC:", cap.get(cv2.CAP_PROP_FOURCC))

while True:
    ret, frame = cap.read()
    if not ret:
        break

    cv2.imshow("Camera", frame)
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

(2) 지원 가능한 포맷/해상도 확인

터미널에서 V4L2 명령으로 확인 가능:

v4l2-ctl --list-formats-ext -d /dev/video0

출력 예시:

[0]: 'YUYV' (YUYV 4:2:2)
    Size: Discrete 640x480, 1280x720, 1920x1080
    Interval: Discrete 1/30s (30.000 fps)
[1]: 'MJPG' (Motion-JPEG)
    Size: Discrete 640x480, 1280x720, 1920x1080
    Interval: Discrete 1/60s (60.000 fps)

👉 위 결과를 참고해 가능한 포맷(FourCC)해상도/FPS 조합을 선택해야 합니다.


(3) GStreamer 백엔드 예시 (고급 설정용)

GStreamer를 이용하면 더 세밀한 제어가 가능합니다:

gst = (
    "v4l2src device=/dev/video0 ! "
    "video/x-raw, width=1280, height=720, framerate=30/1, format=MJPG ! "
    "videoconvert ! appsink"
)
cap = cv2.VideoCapture(gst, cv2.CAP_GSTREAMER)

4. 추가 팁 / 자주 하는 실수

  • ⚠️ cap.set()항상 VideoCapture 객체 생성 직후에 해야 합니다.
    (읽기 루프 시작 후 변경하면 적용되지 않습니다.)
  • ⚠️ CAP_PROP_FPS는 일부 USB 카메라에서 읽기 전용입니다.
    실제 FPS는 v4l2-ctl --get-parm으로 확인하세요.
  • ✅ MJPG 포맷은 대부분의 UVC 카메라에서 고해상도 지원에 유리합니다.
    YUYV는 대역폭을 많이 쓰므로 낮은 해상도에서만 안정적입니다.
  • ⚙️ 만약 설정이 반영되지 않는다면: v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=MJPG 로 먼저 직접 설정 후 OpenCV를 실행해보세요.

5. 정리

  • cv2.VideoCapture의 속성은 카메라 지원 범위와 백엔드에 따라 적용 여부가 달라집니다.
  • CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT, CAP_PROP_FPS, CAP_PROP_FOURCC 조합을 올바르게 설정하고,
    v4l2-ctl 명령으로 지원 형식을 확인해야 합니다.
  • 특히 Linux에서는 V4L2 백엔드 + MJPG 포맷 조합이 가장 호환성이 좋습니다.

댓글 남기기