본문으로 바로가기

파이썬 OpenCV HOG : 보행자 검출하기

category OpenCV 2020. 8. 6. 18:04
728x90

HOG(Hostogram of Oriented Gradient)

  • 보행자 검출을 목적으로 만들어진 Descriptor 이다.
  • 필요한 정보를 추출하고 관계없는 정본는 버림으로써 이미지를 단순화한다.

 

예제

 

HOG 는 다음과 같이 보행자를 식별하기 위한 디스크립터입니다.

 

 

전체 코드입니다.

import os
import cv2

path = os.path.join('video', 'sample.avi')

hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

cap = cv2.VideoCapture(path)
while True:
    ret, frame = cap.read()

    if not ret:
        break

    detected, _ = hog.detectMultiScale(frame)

    for (x, y, w, h) in detected:
        cv2.rectangle(frame, (x, y, w, h), (0, 255, 0), 3)

    cv2.imshow('Detect', frame)
    if cv2.waitKey(10) == 27:
        break

cv2.destroyAllWindows()

 

cv.VideoCapture 를 이용하여 video 를 읽어 각 프레임에 대해 검출을 수행합니다.

cap = cv2.VideoCapture(path)
while True:
    ret, frame = cap.read()

 

한 이미지에 대해 검출된 n x (x, y, w, h)

detected, _ = hog.detectMultiScale(frame)

 

 

cv2.HOGDescriptor_getDefaultPeopleDetector() -> retval

  • retval: pretrained 된 feature vectors

 

cv2.HOGDescriptor.setSVMDetector(svmdetector) -> None

  • svmdetector: SVM 의 input data

 

cv2.HOGDescriptor.detectMultiScale(img, hitThreshold=None, winStride=None, padding=None, scale=None, finalThreshold=None, useMeanshiftGrouping=None) -> rects, weights

  • img: 입력 이미지
  • scale: 검색 윈도우 크기 확대 비율(default=1.05)
  • rects: 검출된 결과 영역 좌표들 (n x (x, y, w, h))
  • weights: 검출된 결과 계수 n x 1

 

테스트

 

하나의 이미지에 대해 테스트를 해보았는데요.

import os
import numpy as np
import cv2
import pyautogui

walk_img = cv2.imread(os.path.join('hog_img', 'walk2.jpg'))
stop_img = cv2.imread(os.path.join('hog_img', 'stop2.jpg'))

hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

w_detected, _ = hog.detectMultiScale(walk_img)
s_detected, _ = hog.detectMultiScale(stop_img)

for (x, y, w, h) in w_detected:
    cv2.rectangle(walk_img, (x, y, w, h), (0, 255, 0), 3)

for (x, y, w, h) in s_detected:
    cv2.rectangle(stop_img, (x, y, w, h), (0, 255, 0), 3)

cv2.imshow('walk_detect', walk_img)
cv2.imshow('stop_detect', stop_img)

cv2.waitKey()
cv2.destroyAllWindows()

 

손 동작, 발 동작을 많이 볼까 했었는데요.

결과를 보면 전신이 보이면 검출할 확률이 높은 것 같습니다.