설치만 잔뜩 하고 정작 화면에는 아무것도 못 띄운 채 PART를 끝내면 김이 빠집니다. 그래서 PART 01의 마지막은 작은 성취로 채웁니다. 웹캠을 켜서 내 얼굴 둘레에 사각형을 그려 보는 것입니다. 검출 원리는 PART 02에서 제대로 배우니, 이 장에서는 "환경이 진짜로 동작한다"는 확인에만 집중합니다.
웹캠을 여는 가장 작은 코드
먼저 가장 단순한 형태로 웹캠 화면만 띄워 봅니다. 다음 내용을 first_run.py로 저장합니다.
# 파일: first_run.py"""웹캠을 열어 화면에 띄운다. q 키로 종료."""import cv2cap = cv2.VideoCapture(0) # 0번 카메라(기본 웹캠)if not cap.isOpened(): raise RuntimeError("웹캠을 열 수 없습니다. 다른 프로그램이 카메라를 쓰고 있는지 확인하세요.")while True: ok, frame = cap.read() if not ok: break cv2.imshow("first run - press q to quit", frame) if cv2.waitKey(1) & 0xFF == ord("q"): # q를 누르면 종료 breakcap.release()cv2.destroyAllWindows()
(face) 환경에서 실행합니다.
python first_run.py
창이 뜨고 웹캠 영상이 보이면 절반은 성공입니다. q 키를 누르면 창이 닫힙니다. 여기서 cv2.VideoCapture(0)의 0은 첫 번째 카메라를 뜻하고, 외장 웹캠을 쓴다면 1이나 2로 바꿔 시도합니다.
얼굴 둘레에 사각형 그리기
이제 한 걸음 더 나아가, OpenCV에 기본 포함된 검출기로 얼굴을 찾아 사각형을 그려 봅니다. 앞 코드에 검출기 로딩과 그리기 부분을 더합니다.
# 파일: first_run.py"""웹캠에서 얼굴을 찾아 사각형을 그린다. q 키로 종료."""import osimport sysimport globimport cv2# OpenCV에 기본 포함된 얼굴 검출기(하르 캐스케이드)의 경로를 찾는다.# conda-forge opencv에는 cv2.data가 없어 두 위치를 모두 시도한다.def frontalface_cascade(): name = "haarcascade_frontalface_default.xml" if hasattr(cv2, "data"): # pip opencv-python p = os.path.join(cv2.data.haarcascades, name) if os.path.exists(p): return p hits = glob.glob(os.path.join(sys.prefix, "share", "opencv*", # conda-forge "haarcascades", name)) return hits[0]detector = cv2.CascadeClassifier(frontalface_cascade())cap = cv2.VideoCapture(0) # 0번 카메라(기본 웹캠)if not cap.isOpened(): raise RuntimeError("웹캠을 열 수 없습니다. 다른 프로그램이 카메라를 쓰고 있는지 확인하세요.")while True: ok, frame = cap.read() if not ok: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 검출은 흑백에서 빠르다 faces = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("first run - press q to quit", frame) if cv2.waitKey(1) & 0xFF == ord("q"): # q를 누르면 종료 breakcap.release()cv2.destroyAllWindows()
다시 실행하면, 카메라에 잡힌 얼굴 둘레에 초록색 사각형이 따라다니는 것을 볼 수 있습니다. 위의 frontalface_cascade()는 OpenCV가 설치될 때 함께 들어오는 검출기 파일의 경로를 찾아 주므로, 따로 무엇을 내려받지 않아도 바로 쓸 수 있습니다. 흔히 보는 예제는 이 경로를 cv2.data.haarcascades로 적지만, 이 속성은 conda-forge의 opencv에는 없어 우리 환경에서는 오류가 납니다. 그래서 두 위치를 모두 시도하는 함수로 감쌌습니다. 자세한 배경은 [PART 02. 얼굴 검출]의 Haar Cascade 장에서 다시 설명합니다.
실무 팁. macOS에서는 처음 실행할 때 카메라 접근 권한을 묻는 창이 뜹니다. 허용하지 않으면 영상이 검은 화면으로만 나오니, 시스템 설정의 개인정보 보호에서 터미널(또는 사용하는 편집기)에 카메라 권한을 켜 주세요. 윈도우에서도 "카메라에 대한 앱 액세스"가 꺼져 있으면 같은 증상이 나타납니다.
자주 나는 문제와 해결
| 증상 | 원인 | 해결 |
|---|---|---|
| 창이 안 뜨고 바로 종료 | 웹캠을 못 엶 | 카메라 번호를 0 대신 1로 변경, 다른 앱 종료 |
| 검은 화면만 나옴 | 카메라 권한 차단 | 운영체제 개인정보 설정에서 권한 허용 |
| 얼굴에 사각형이 안 생김 | 정면·조명 부족 | 정면을 보고 밝은 곳에서, minNeighbors 값을 낮춰 시도 |
| 창이 멈춘 듯 반응 없음 | waitKey 누락 |
cv2.waitKey(1)이 루프 안에 있는지 확인 |
이 장에서 기억할 것
cv2.VideoCapture(0)로 웹캠을 열고, OpenCV에 기본 포함된 하르 캐스케이드 검출기로 얼굴 둘레에 사각형을 그려 보았습니다. 이 작은 실행이 의미하는 바는 큽니다. conda로 꾸린 환경이 카메라 입력부터 영상 처리, 화면 출력까지 막힘없이 돌아간다는 증거이기 때문입니다. PART 01은 여기서 마무리됩니다. 다음 PART 02에서는 방금 슬쩍 써 본 하르 캐스케이드를 비롯해 여러 검출기의 원리와 성능을 본격적으로 파고듭니다.