웹캠과 파이썬으로 실시간 얼굴 인식을 30분 만에 만드는 가이드입니다. OpenCV와 face_recognition 라이브러리 설치부터 코드 실행, 자주 막히는 카메라 권한·속도 이슈 해결까지 비개발자도 따라 할 수 있게 단계별로 정리했습니다.

요즘 노트북 카메라 앞에 앉으면 자동으로 로그인되거나, 사진 앱이 가족별로 사진을 자동 분류해주는 걸 보면 한 번쯤 "저거 나도 만들 수 있나?" 싶은 순간이 옵니다. 의외로 실시간 얼굴 인식은 오픈소스 라이브러리 덕분에 코드 50줄도 안 되는 분량으로 동작합니다. 이 글은 컴퓨터 비전을 처음 만져보는 분도 따라 할 수 있도록, 환경 준비부터 첫 인식 화면이 뜨는 순간까지 한 호흡으로 안내합니다. 저도 처음 돌렸을 때 "이게 이렇게 쉽게 된다고?" 싶었거든요.
실시간 얼굴 인식이 뭐길래
실시간 얼굴 인식은 카메라가 매 순간 받아들이는 영상에서 얼굴 위치를 찾고, 그 얼굴이 누구인지 미리 등록된 사람과 비교해 알려주는 기술입니다. 크게 두 단계로 나뉩니다.
| 단계 | 하는 일 | 쉬운 비유 |
|---|---|---|
| 얼굴 검출 (detection) | 영상 속에서 얼굴 위치를 네모로 찾아냄 | "어, 사람 얼굴이 있네" |
| 얼굴 인식 (recognition) | 그 얼굴이 누구인지 식별 | "아, 이 사람 김OO이네" |
검출만 하면 익명의 "사람 얼굴 1개 발견" 수준이고, 인식까지 가야 "이 얼굴은 등록된 A씨"라고 말할 수 있습니다. 이번 글에서는 둘 다 한 번에 처리해주는 face_recognition 라이브러리(파이썬용 얼굴 인식 도구)를 씁니다. 내부적으로는 dlib이라는 더 낮은 수준의 라이브러리를 감싸서, 복잡한 수학을 함수 한 줄로 끝내줍니다.
웹캠 영상 → 프레임 한 장 추출 → 얼굴 위치 찾기 → 얼굴 특징 벡터 계산
↓
등록된 사람 벡터와 비교
↓
이름 라벨 그려서 화면 출력
위 흐름이 1초에 수십 번 반복되면 "실시간"이 됩니다.
시작 전 준비물 체크
본격적으로 들어가기 전, 아래 항목을 먼저 확인해주세요. 여기서 막히면 뒤가 다 어그러집니다.
- [ ] 웹캠이 달린 노트북 또는 외장 USB 웹캠
- [ ] 파이썬 3.9 이상 설치 (글 작성 시점 기준 3.11 권장)
- [ ] 인식하고 싶은 사람의 정면 사진 1~2장 (jpg/png)
- [ ] 인터넷 연결 (라이브러리 다운로드용)
파이썬은 python.org 공식 사이트에서 설치할 수 있습니다. 설치할 때 "Add Python to PATH" 체크박스를 꼭 켜주세요. 이걸 빼먹으면 나중에 "python이라는 명령을 못 찾겠다"는 에러가 뜹니다.
💡 맥(macOS)이라면 카메라 권한도 미리 챙겨야 합니다. 시스템 설정 → 개인정보 보호 → 카메라에서, 우리가 코드를 돌릴 터미널 앱(예: 터미널, iTerm)에 권한을 줘야 합니다. 이걸 안 하면 코드는 멀쩡한데 검은 화면만 나옵니다.
여기서 잠깐, 터미널이라는 단어가 자주 나올 텐데 검은 화면에 글자로 명령을 입력하는 프로그램입니다. 윈도우에서는 "명령 프롬프트" 또는 "PowerShell", 맥에서는 "터미널" 앱입니다. 컴퓨터에게 마우스 대신 글로 직접 말을 거는 창구라고 생각하시면 됩니다.
라이브러리 설치 — 가장 자주 막히는 구간
라이브러리는 다른 사람이 미리 만들어둔 코드 모음입니다. 우리가 직접 얼굴 인식 알고리즘을 짤 필요 없이, 잘 만들어진 걸 가져다 쓰는 거죠. 터미널을 열고 다음 명령을 차례로 입력합니다.
pip install opencv-python
pip install face_recognition
pip install numpy
pip은 파이썬용 라이브러리 다운로드 도구입니다. 앱스토어에서 앱 깔듯이, 명령 한 줄로 설치해줍니다. 위 세 줄은 각각 영상 처리(OpenCV), 얼굴 인식(face_recognition), 숫자 계산(numpy)을 담당하는 라이브러리를 깔라는 뜻입니다.
여기서 거의 모든 사람이 한 번씩 막힙니다. face_recognition은 내부적으로 dlib을 깔아야 하는데, dlib이 C++ 컴파일러를 요구하기 때문입니다.
| 운영체제 | 자주 나는 에러 | 해결법 |
|---|---|---|
| 윈도우 | CMake is not installed |
CMake 설치 후 Visual Studio Build Tools 추가 |
| 맥 | clang error |
터미널에 xcode-select --install 입력 |
| 리눅스 | cmake not found |
sudo apt install cmake build-essential |
설치에 5~15분 정도 걸릴 수 있습니다. 진행 막대 없이 멈춘 것처럼 보여도 컴파일 중일 가능성이 높으니 강제 종료하지 마세요. 저도 처음엔 "얼었나?" 싶어서 두 번이나 껐다 켰습니다.
설치가 끝났는지 확인은 이렇게 합니다.
python -c "import face_recognition; print('OK')"
OK가 출력되면 성공입니다. 에러가 나면 메시지를 그대로 복사해서 검색하면 거의 답이 나와 있습니다.
50줄짜리 핵심 코드
이제 실제 코드입니다. 메모장이나 VS Code 같은 편집기를 열어 아래 내용을 붙여넣고 face_app.py라는 이름으로 저장하세요. 같은 폴더에 인식하고 싶은 사람의 사진을 me.jpg로 저장해두면 됩니다.
import cv2
import face_recognition
import numpy as np
# 1. 등록할 얼굴 사진 불러오기
known_image = face_recognition.load_image_file("me.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]
known_faces = [known_encoding]
known_names = ["나"]
# 2. 웹캠 켜기
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 3. 속도 위해 1/4로 축소
small = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
rgb_small = cv2.cvtColor(small, cv2.COLOR_BGR2RGB)
# 4. 얼굴 위치 + 특징 추출
locations = face_recognition.face_locations(rgb_small)
encodings = face_recognition.face_encodings(rgb_small, locations)
for (top, right, bottom, left), enc in zip(locations, encodings):
matches = face_recognition.compare_faces(known_faces, enc)
name = "Unknown"
if True in matches:
name = known_names[matches.index(True)]
# 축소했던 좌표 원래대로
top, right, bottom, left = top*4, right*4, bottom*4, left*4
cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
cv2.putText(frame, name, (left, top-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
cv2.imshow("Face", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
이 코드는 위에서부터 ① 내 얼굴 사진을 학습용으로 등록하고 ② 웹캠을 켠 뒤 ③ 매 프레임마다 얼굴을 찾아 ④ 등록된 얼굴이면 이름을, 아니면 "Unknown"을 표시합니다. 화면이 뜨면 키보드 q를 눌러 종료하세요.
실행은 터미널에서 코드 파일이 있는 폴더로 이동한 뒤 다음 명령을 입력합니다.
python face_app.py
1~2초 후 웹캠 창이 뜨고, 얼굴 주변에 초록색 네모와 이름이 보이면 성공입니다.
자주 막히는 부분과 해결법
여기까지 따라오면서 막히는 지점은 거의 패턴이 정해져 있습니다. 제가 직접 겪었거나 주변에서 가장 많이 본 것들만 추렸습니다.
검은 화면만 뜨고 영상이 안 나옴 카메라 권한 문제일 가능성이 99%입니다. 맥은 위에서 말한 카메라 권한, 윈도우는 설정 → 개인정보 → 카메라에서 데스크톱 앱 허용을 켜주세요. 그래도 안 되면 cv2.VideoCapture(0)의 0을 1로 바꿔보세요. 외장 카메라가 잡혔을 수 있습니다.
IndexError: list index out of range me.jpg에 얼굴이 검출이 안 됐다는 뜻입니다. 사진이 너무 어둡거나 옆모습이거나 마스크를 썼을 때 자주 납니다. 정면 사진, 충분히 밝은 사진으로 바꿔보세요.
프레임이 끊기거나 너무 느림 얼굴 인식은 CPU를 꽤 많이 씁니다. 위 코드에서 이미 1/4로 축소했지만, 그래도 느리면 face_locations에 model="hog" 옵션을 명시하면 됩니다(기본값이긴 합니다). 더 정확한 cnn 모델은 GPU 없이는 초당 1~2프레임도 안 나옵니다.
Unknown만 계속 뜸 compare_faces의 기본 허용 오차가 0.6인데, 조명이나 각도 차이가 크면 같은 사람도 다르게 판단합니다. compare_faces(known_faces, enc, tolerance=0.5) 처럼 값을 낮추면 더 엄격하게, 0.65 정도로 올리면 더 관대하게 인식합니다.
⚠️ tolerance를 너무 올리면(0.7+) 다른 사람도 같은 사람으로 오인합니다. 0.5~0.6 사이에서 조절하시는 걸 권합니다.
한 발 더 나아가기
기본 코드가 동작했다면, 비교적 적은 수정으로 흥미로운 기능을 붙일 수 있습니다.
- 여러 사람 등록:
known_faces와known_names리스트에 항목을 추가하면 됩니다. 예를 들어 가족 5명, 동호회 멤버 10명을 등록해두면 자동으로 누가 있는지 라벨링됩니다. - 출입 기록 자동 저장: 인식될 때마다 이름과 시간을 csv 파일에 한 줄씩 기록하면, 간단한 출입 로그 시스템이 됩니다. 사무실 출퇴근 자동 기록처럼요.
- 모르는 얼굴 알림: "Unknown"이 일정 시간 이상 잡히면 슬랙이나 카카오톡으로 알림을 보내는 식으로 확장하면, 가벼운 보안 카메라가 됩니다.
- 모자이크 처리: 얼굴 영역만 블러를 걸어 유튜브 영상 후처리 도구로 응용할 수 있습니다.
| 응용 예시 | 추가 작업량 | 활용 시나리오 |
|---|---|---|
| 출입 로그 csv 저장 | 코드 5줄 추가 | 1인 사무실 출퇴근 기록 |
| 다인 인식 | 사진만 추가 | 가족 사진 자동 분류 |
| 알림 연동 | 메시지 API 연결 | 빈집 모니터링 |
| 얼굴 모자이크 | OpenCV blur 함수 1줄 | 영상 편집 후처리 |
마지막으로 개인정보 이슈는 꼭 짚고 넘어가고 싶습니다. 다른 사람의 얼굴 데이터는 본인 동의 없이 저장하지 마세요. 가족이나 본인 얼굴로 실험하는 건 괜찮지만, 카페나 거리에서 찍은 영상으로 데이터셋을 만들면 국내 개인정보보호법(2024년 개정 기준)에서 문제가 될 수 있습니다.
마무리
이 정도면 웹캠 앞에서 내 이름이 초록 박스에 뜨는 데까지 30분이면 충분합니다. 라이브러리 설치에서 한 번, 카메라 권한에서 한 번, 사진 품질에서 한 번 막히기 쉬운데 위에 정리한 표를 보면서 차근차근 짚으면 거의 다 풀립니다. 첫 인식이 성공하면 그다음부터는 응용이 훨씬 쉬워집니다 — 사진 한 장 추가하고, 출력 형식만 바꾸는 식이거든요.
다음 단계로 추천드리고 싶은 건 여러 사람을 등록해보고, 그다음 인식 결과를 파일로 저장하는 것입니다. 이 두 가지만 해봐도 "코드를 가져다 쓰는 사람"에서 "코드를 약간 고쳐 쓰는 사람"으로 한 단계 올라갑니다. 막히는 부분이 있다면 에러 메시지를 그대로 복사해 검색하거나 ChatGPT에 붙여넣으면 답이 거의 다 나옵니다. 일단 한 번 돌려보시는 게 핵심입니다.
'개발 & 기술 > 컴퓨터 비전' 카테고리의 다른 글
| YOLO v11 한국어 사용법, 객체 인식 5분 시작 가이드 (0) | 2026.05.26 |
|---|---|
| 우분투에 OpenCV 3.0 설치 (0) | 2015.09.22 |
| [우분투 12.04] 우분투12.04에 OpenCV 2.4 설치하기 (0) | 2015.09.21 |
| PCL 1.8 Install (0) | 2015.09.11 |
| Trouble Shooting (0) | 2014.09.28 |