OpenCV 비전 실무15장 · 비디오 처리와 실시간 영상처리11 / 22← 이전목차다음 →MetaContents

15장. 비디오 처리와 실시간 영상처리

웹캠 다루기

동영상 파일이 녹화된 방송이라면 웹캠은 생방송입니다. 녹화 방송은 멈췄다가 다시 볼 수 있지만, 생방송은 지금 이 순간의 장면만 들어오고 끝이 정해져 있지 않습니다. 그래서 웹캠 코드는 "언제 끝낼지"를 사람이 정해 줘야 합니다. 보통 키보드의 q 를 누르면 끝내게 짭니다.

카메라 열기, 한 장 읽기, 처리하기, 창에 보이기, q 로 끝내기의 다섯 단계를 이은 흐름도

그림은 동영상 파일의 반복과 거의 같습니다. 다른 점은 둘이 더 붙는다는 것입니다. 2장에서 본 cv2.imshow 로 창에 보이는 일과, cv2.waitKey(1) 로 1ms 동안 키를 기다려 q 가 눌렸는지 보는 일입니다. 여기서 생방송의 카메라가 cv2.VideoCapture(0) 이고, 방송을 끝내는 단추가 q 키입니다.

웹캠 코드의 생김새

아래는 이 PC 에서 실행하지 않은 안내 코드(웹캠과 화면 창이 필요)입니다. 교안의 자동 실행에는 카메라와 화면 창이 없어 넣지 않았습니다. 내 PC 에 웹캠이 있으면 VS Code 에서 파이썬 파일로 저장해 실행해 보세요.

출력
import cv2

cap = cv2.VideoCapture(0)               # 0 = 첫 번째 카메라(장치 번호)
if not cap.isOpened():
    raise SystemExit("카메라를 열지 못했습니다")

while True:
    ok, frame = cap.read()              # 카메라에서 지금 장면 한 장
    if not ok:                          # 카메라가 빠지면 False
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(cv2.GaussianBlur(gray, (5, 5), 0), 50, 150)
    cv2.imshow("camera", frame)         # 원본 창
    cv2.imshow("edges", edges)          # 경계 창
    key = cv2.waitKey(1) & 0xFF         # 1ms 기다리며 누른 키를 받는다
    if key == ord("q"):                 # q 를 누르면 끝낸다
        break

cap.release()                           # 카메라를 놓아준다(다른 프로그램이 쓸 수 있게)
cv2.destroyAllWindows()                 # 창을 모두 닫는다

카메라가 열리지 않으면 Windows 에서는 아래처럼 카메라를 다루는 방식을 골라 열기도 합니다. 이것도 실행하지 않은 안내 코드입니다.

출력
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)   # CAP_DSHOW = DirectShow 방식으로 연다
cap = cv2.VideoCapture(1)                  # 카메라가 둘이면 1 번도 시험해 본다

웹캠이 안 될 때

증상까닭해결
isOpened() 가 False다른 프로그램(화상회의 등)이 카메라를 쓰는 중그 프로그램을 닫는다
isOpened() 가 FalseWindows 설정에서 앱의 카메라 사용이 꺼져 있다설정 → 개인 정보 및 보안 → 카메라에서 켠다
창이 하얗거나 멈춘다cv2.waitKey 가 없다반복 안에 cv2.waitKey(1) 을 넣는다
q 를 눌러도 안 끝난다키보드 입력이 다른 창으로 간다OpenCV 창을 한 번 눌러 고른 뒤 q 를 누른다
끝낸 뒤 카메라 불이 켜져 있다release() 를 안 했다반복 뒤에 cap.release()

cv2.waitKey 가 돌려주는 번호와 ord("q") 를 견주는 부분은 카메라 없이도 확인할 수 있습니다.

Python
# ord: 글자의 번호(유니코드 번호)를 돌려준다. waitKey 가 돌려주는 번호와 견준다
print("q 의 번호:", ord("q"))           # 결과: 113
print("Q 의 번호:", ord("Q"))           # 결과: 81 → 대문자는 번호가 다르다

# & 0xFF: 번호의 끝 8비트만 남긴다. 운영체제에 따라 앞자리가 붙어 오는 것을 떼어 낸다
key = 0x100071                           # 앞자리가 붙어 온 번호라고 해 보자
print("끝 8비트:", key & 0xFF, "→ q 인가:", (key & 0xFF) == ord("q"))   # 결과: 113 → True

주의할 점

  • 웹캠의 FPS 는 카메라와 조명에 따라 달라집니다. 어두우면 카메라가 노출 시간을 늘려 FPS 가 떨어지기도 합니다.
  • 웹캠 반복은 끝이 없으므로 반드시 끝내는 조건(q 키, 프레임 수 제한)을 넣습니다.
← 이전 절15장 · 실시간 처리와 처리 시간다음 절 →15장 · 개인정보와 동영상