대상: 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를 지원하는 빌드인지 확인하고 필요 시 재설치.
- 점유 중인 프로세스가 없고 권한이 맞다면, 인덱스나 포맷을 조정해본다.
이 단계를 차례로 따라가면 대부분의 “카메라 안 열림” 문제는 해결된다.