대상: 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 포맷 조합이 가장 호환성이 좋습니다.