Bonjour à tous, Je travaille sur un programme de détection humaine en utilisant OpenCV en utilisant Python. J'ai vu this very good example et je l'ai couru sur les échantillons qu'il avait. Il peut détecter les personnes peu importe où ils sont confrontés et a une détection de chevauchement décent ainsi que des mouvements flous. Cependant, lorsque je l'ai exécuté sur certaines images que j'ai eues (la plupart du temps, des photos de personnes au niveau du genou, de la taille et du buste), j'ai découvert que le logiciel ne détecte pas tout le monde. Vous pouvez obtenir le photos from this link. C'est le code que j'utilise:OpenCV 3 Python - Détection humaine partielle?
# import the necessary packages
from __future__ import print_function
from imutils.object_detection import non_max_suppression
from imutils import paths
import numpy as np
import argparse
import imutils
import cv2
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True, help="path to images directory")
args = vars(ap.parse_args())
# initialize the HOG descriptor/person detector
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# loop over the image paths
imagePaths = list(paths.list_images(args["images"]))
for imagePath in imagePaths:
# load the image and resize it to (1) reduce detection time
# and (2) improve detection accuracy
image = cv2.imread(imagePath)
image = imutils.resize(image, width=min(400, image.shape[1]))
orig = image.copy()
# detect people in the image
(rects, weights) = hog.detectMultiScale(image, winStride=(4, 4),
padding=(8, 8), scale=1.05)
# draw the original bounding boxes
for (x, y, w, h) in rects:
cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)
# apply non-maxima suppression to the bounding boxes using a
# fairly large overlap threshold to try to maintain overlapping
# boxes that are still people
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
pick = non_max_suppression(rects, probs=None, overlapThresh=0.65)
# draw the final bounding boxes
for (xA, yA, xB, yB) in pick:
cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)
# show some information on the number of bounding boxes
filename = imagePath[imagePath.rfind("/") + 1:]
print("[INFO] {}: {} original boxes, {} after suppression".format(
filename, len(rects), len(pick)))
# show the output images
cv2.imshow("Before NMS", orig)
cv2.imshow("After NMS", image)
cv2.waitKey(0)
C'est assez simple. Il parcourt les images, trouve les personnes dedans, puis dessine des rectangles de délimitation. Si les rectangles se chevauchent, ils sont réunis pour éviter les faux positifs et détecter plus d'une personne dans une seule personne.
Cependant, comme je l'ai mentionné ci-dessus, le code ne reconnaît pas les gens si des parties de leurs pieds ne sont pas présents.
Existe-t-il un moyen de faire en sorte qu'OpenCV reconnaisse les personnes qui n'ont qu'une partie de leur corps (genou, taille, poitrine vers le haut) présentes dans une vidéo? Dans mes scénarios de cas d'utilisation, je ne pense pas qu'il sera essentiel de rechercher les bras et les jambes, tant que le torse et la tête sont présents, je devrais être capable de le voir.
Toute avance serait très appréciée.
Vous pouvez utiliser les cascades Haar, qui ont déjà été entraînées pour la détection du haut du corps. Voir [ici] (http://stackoverflow.com/a/31834603/5008845) et ses liens – Miki
@Miki il semble que Haar Cascades qui ont été formés pour la détection du haut du corps ne peut détecter le haut du corps que si tout le corps est vu ? Je cherche peut-être un fichier différent de cascade haar xml. – Razgriz
Cela n'a pas beaucoup de sens pour moi ... Mais je ne les ai jamais utilisés, donc je ne peux pas dire avec certitude – Miki