인공지능

🎥 OpenCV : 이미지 속 사람 검출하기

존카터 2025. 7. 18. 09:27

이번에는 이미지에 있는 사람(또는 사람 형태)를 검출하는 방법을 배워볼 거예요. 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(관심영역) 자른 후 검출

결과