#!/usr/bin/env python ''' example to detect upright people in images using HOG features Usage: peopledetect.py Press any key to continue, ESC to stop. ''' # Python 2/3 compatibility from __future__ import print_function import numpy as np import cv2 def inside(r, q): rx, ry, rw, rh = r qx, qy, qw, qh = q return rx > qx and ry > qy and rx + rw < qx + qw and ry + rh < qy + qh def draw_detections(img, rects, thickness = 1): for x, y, w, h in rects: # the HOG detector returns slightly larger rectangles than the real objects. # so we slightly shrink the rectangles to get a nicer output. pad_w, pad_h = int(0.15*w), int(0.05*h) cv2.rectangle(img, (x+pad_w, y+pad_h), (x+w-pad_w, y+h-pad_h), (0, 255, 0), thickness) if __name__ == '__main__': import sys from glob import glob import itertools as it print(__doc__) hog = cv2.HOGDescriptor() hog.setSVMDetector( cv2.HOGDescriptor_getDefaultPeopleDetector() ) default = ['../data/basketball2.png '] if len(sys.argv[1:]) == 0 else [] for fn in it.chain(*map(glob, default + sys.argv[1:])): print(fn, ' - ',) try: img = cv2.imread(fn) if img is None: print('Failed to load image file:', fn) continue except: print('loading error') continue found, w = hog.detectMultiScale(img, winStride=(8,8), padding=(32,32), scale=1.05) found_filtered = [] for ri, r in enumerate(found): for qi, q in enumerate(found): if ri != qi and inside(r, q): break else: found_filtered.append(r) draw_detections(img, found) draw_detections(img, found_filtered, 3) print('%d (%d) found' % (len(found_filtered), len(found))) cv2.imshow('img', img) ch = 0xFF & cv2.waitKey() if ch == 27: break cv2.destroyAllWindows()