이번에는 이미지에 있는 사람(또는 사람 형태)를 검출하는 방법을 배워볼 거예요. OpenCV에서는 HOG(Histogram of Oriented Gradients) + SVM 기반의 기본 보행자 감지기를 제공합니다.
1️⃣ 사람 검출 기본 코드
import cv2
# 이미지 불러오기
img = cv2.imread("snapchat/frame_0001.jpg")
# HOG 디텍터 초기화
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 사람 검출 (bounding box 반환)
boxes, weights = hog.detectMultiScale(img, winStride=(8,8))
# 검출된 영역 그리기
for (x, y, w, h) in boxes:
cv2.rectangle(img, (x, y), (x+w, y+h), (0,255,0), 2)
# 결과 출력
cv2.imshow("Detected People", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
✅ 코드 설명 & 왜 이렇게 쓸까?
- cv2.HOGDescriptor()
- 이미지를 보고 사람처럼 생긴 패턴(윤곽, 방향성)을 수치로 표현하는 도구
- hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
- OpenCV가 기본 제공하는 사람 전용 탐지 모델(SVM) 사용
- 새로 학습시킬 필요 없이 바로 사용 가능
- hog.detectMultiScale()
- 이미지를 **여러 크기(멀리 있는 사람/가까운 사람)**로 잘라보면서 사람을 찾아줌
- winStride=(8,8) → 탐색 간격. 작게 하면 더 정확하지만 느려짐
- cv2.rectangle()
- 찾은 사람 위치에 초록색 박스를 그려줌
2️⃣ HOG가 뭘까?
HOG = Histogram of Oriented Gradients
- 쉽게 말해서 이미지의 윤곽(모양의 방향)을 숫자로 표현하는 방법이에요.
- 사람은 대략적으로 머리-몸통-다리 형태가 비슷하죠?
- HOG는 이미지 속에서 어디가 밝고, 어디가 어두운지, 그 경계가 어느 방향으로 흐르는지를 살펴보고 사람처럼 생긴 패턴인지 판단해요.
예를 들어,
- 사람의 다리 부분 → 세로로 긴 윤곽
- 어깨 부분 → 가로 윤곽
- 배경(하늘/바닥)은 일정한 패턴이 없어서 무시
➡️ 이렇게 사람의 일반적인 모양 패턴을 숫자로 변환해서 탐지하는 거
3️⃣ SVM은 왜 필요할까?
HOG가 사람 모양의 특징을 뽑아줬다면, SVM(Support Vector Machine)은 그 특징을 보고 사람인지 아닌지 구분하는 판별기입니다.
- HOG: “이 부분은 직선이 많고 위쪽이 둥글어!” (특징 추출)
- SVM: “이건 사람일 가능성이 높네!” (판단)
➡️ 둘이 합쳐져서 사람 모양을 인식하는 완성된 탐지기가 되는 것
4️⃣ 이 방법의 특징
✅ 추가 학습 없이 바로 사용 가능
✅ 단일 이미지뿐만 아니라 동영상 프레임에도 적용 가능
✅ 보행자(사람) 검출에 특화된 모델 내장
하지만,
- 멀리 있거나 너무 작은 사람은 잘 못 찾을 수 있어요.
- 더 높은 정확도가 필요하면 딥러닝 기반 모델(DNN)이 더 좋습니다.
5️⃣ 응용 아이디어
- 동영상에 사람 실시간 검출 → while 루프로 프레임마다 detectMultiScale() 적용
- 검출된 사람 수 세기 → len(boxes)
- 특정 구역만 검출 → ROI(관심영역) 자른 후 검출
결과

'인공지능' 카테고리의 다른 글
| LabelEncoder vs OneHotEncoder (4) | 2025.07.31 |
|---|---|
| 사이킷런에서 의사결정나무 결정 과정 (0) | 2025.07.31 |
| 🎥 OpenCV 입문: 이미지 & 동영상 데이터 불러오기 (6) | 2025.07.17 |
| 📝 입소문 시뮬레이션 코드, 진짜 쉽게 이해하기! (5) | 2025.07.15 |
| 📢 입소문 확산 시뮬레이션: 네트워크와 시계열 변화까지! (1) | 2025.07.15 |