USB 카메라를 OpenCV로 열 때 자주 막히는 포인트 정리

대상: OpenCV로 실시간 영상 처리나 카메라 테스트를 하려는 개발자
환경: Ubuntu 20.04 / 22.04, Python 3.x, OpenCV (cv2)


1. 문제 요약

USB 카메라를 연결하고 다음과 같이 OpenCV 코드로 열었을 때,
카메라 화면이 뜨지 않거나 cv2.VideoCapture() 가 실패하는 경우가 많다.

import cv2

cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("Camera open failed!")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        print("Frame read failed!")
        break
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

실행 시 다음과 같은 문제가 자주 발생한다:

  • Camera open failed!
  • 카메라가 열리지만 화면이 검정색
  • /dev/video0 장치가 없거나 permission denied

2. 원인/배경

OpenCV에서 카메라가 열리지 않는 원인은 크게 다음과 같다:

원인설명
장치 인덱스 오류실제 카메라가 /dev/video0이 아닐 수 있음
권한 문제일반 유저가 /dev/video0 접근 권한이 없을 수 있음
다른 프로그램 점유cheese, zoom, Teams 등 다른 앱이 카메라를 점유 중
드라이버/포맷 문제MJPEG, YUYV 등 인코딩 포맷이 OpenCV에서 처리 불가
GStreamer 백엔드 설정 문제Ubuntu에서 OpenCV가 GStreamer와 호환되지 않는 경우

3. 해결 순서

1️⃣ 연결된 카메라 장치 확인

ls /dev/video*

출력 예시:

/dev/video0  /dev/video1

여러 개 있다면, v4l2-ctl로 실제 카메라 정보를 확인한다.

sudo apt install v4l-utils
v4l2-ctl --list-devices

2️⃣ 카메라 권한 설정

일반 사용자가 접근할 수 없을 경우 다음으로 권한을 부여한다.

sudo chmod 666 /dev/video0

지속적으로 유지하려면 video 그룹에 사용자 추가:

sudo usermod -aG video $USER

그 후 로그아웃 후 재로그인.


3️⃣ 카메라가 점유되어 있는지 확인

다른 프로그램이 카메라를 이미 사용 중일 수 있다.

fuser /dev/video0

PID가 나오면 해당 프로세스를 종료하거나 재부팅한다.


4️⃣ OpenCV가 GStreamer 없이 빌드된 경우

특히 Ubuntu apt 버전 OpenCV는 GStreamer 지원이 꺼져 있을 수 있다.
확인 방법:

cv2.getBuildInformation()

출력에서 GStreamer: YES 가 보이지 않으면,
GStreamer 지원이 없는 빌드다.

이 경우 Python용 OpenCV를 다시 설치하거나 빌드한다:

pip install opencv-python-headless

또는 직접 빌드 시 다음 옵션 포함:

-D WITH_GSTREAMER=ON

5️⃣ VideoCapture 인덱스/파이프라인 바꾸기

여러 장치가 있을 경우 0번이 USB 카메라가 아닐 수 있다.

cap = cv2.VideoCapture(1)

또는 GStreamer 파이프라인을 명시적으로 지정:

cap = cv2.VideoCapture("v4l2src device=/dev/video0 ! videoconvert ! appsink", cv2.CAP_GSTREAMER)

6️⃣ 해상도 강제 설정

OpenCV가 자동 설정 실패 시 직접 지정해준다.

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

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

  • 노트북 내장 카메라와 USB 카메라 혼동
    /dev/video* 순서가 부팅 때마다 바뀔 수 있다.
    udev 규칙을 이용해 고정 이름을 지정할 수도 있다.
  • MJPEG/YUYV 포맷 호환성
    → 일부 저가형 카메라는 MJPEG만 지원하며 OpenCV 기본 백엔드에서 안 보일 수 있다.
    v4l2-ctl --list-formats-ext 로 지원 포맷 확인 가능.
  • WSL 환경에서 실행 시
    → WSL2에서는 물리적 USB 카메라 접근이 안 된다.
    → Windows용 Python 또는 리눅스 네이티브 환경에서 실행해야 한다.

5. 정리

  • /dev/video* 장치와 권한을 먼저 확인한다.
  • v4l2-ctl 로 실제 카메라 연결 상태를 점검한다.
  • OpenCV가 GStreamer를 지원하는 빌드인지 확인하고 필요 시 재설치.
  • 점유 중인 프로세스가 없고 권한이 맞다면, 인덱스나 포맷을 조정해본다.

이 단계를 차례로 따라가면 대부분의 “카메라 안 열림” 문제는 해결된다.

댓글 남기기