15장. 비디오 처리와 실시간 영상처리
웹캠 다루기
동영상 파일이 녹화된 방송이라면 웹캠은 생방송입니다. 녹화 방송은 멈췄다가 다시 볼 수 있지만, 생방송은 지금 이 순간의 장면만 들어오고 끝이 정해져 있지 않습니다. 그래서 웹캠 코드는 "언제 끝낼지"를 사람이 정해 줘야 합니다. 보통 키보드의 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() 가 False | Windows 설정에서 앱의 카메라 사용이 꺼져 있다 | 설정 → 개인 정보 및 보안 → 카메라에서 켠다 |
| 창이 하얗거나 멈춘다 | cv2.waitKey 가 없다 | 반복 안에 cv2.waitKey(1) 을 넣는다 |
| q 를 눌러도 안 끝난다 | 키보드 입력이 다른 창으로 간다 | OpenCV 창을 한 번 눌러 고른 뒤 q 를 누른다 |
| 끝낸 뒤 카메라 불이 켜져 있다 | release() 를 안 했다 | 반복 뒤에 cap.release() |
cv2.waitKey 가 돌려주는 번호와 ord("q") 를 견주는 부분은 카메라 없이도 확인할 수 있습니다.
# 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 키, 프레임 수 제한)을 넣습니다.