2016-01-19 45 views
8

Istnieje wiele dostępnych materiałów do tego w C++. Chciałbym wiedzieć, czy istnieje sposób na wykrywanie całego ciała za pomocą OpenCV w Pythonie-2.7?Wykrywanie i śledzenie całego ciała za pomocą OpenCV + Python-2.7

Biorąc pod uwagę wideo osoby idącej wzdłuż płaszczyzny strzałkowej (kamera wykonana pod kątem 90 stopni od kierunku marszu), chciałbym związać obszar zainteresowania prostokątem obejmującym całe ciało tej osoby i śledzić to samo w ramce ruchu według klatki.

+0

pytania zadaje nam polecić lub znaleźć książki, narzędzia, biblioteki oprogramowania, samouczek lub innych zasobów poza miejsce powstania off-topic na przepełnienie stosu, ponieważ mają tendencję, aby przyciągnąć uparty odpowiedzi i spam. Zamiast tego opisz problem i to, co zostało zrobione do tej pory, aby go rozwiązać. – M4rtini

+0

@ M4rtini: Dzięki za informację; Dodałem szczegóły. Poszukuję wykonalnego rozwiązania problemu, a nie materiałów do nauki. –

+0

Czy próbowałeś go wykryć kaskadą haar? istnieją kaskady haarów do wykrywania całego ciała https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_fullbody.xml – Arijit

Odpowiedz

12

Ten używa deskryptora wieprza, który można znaleźć w sample/python/peopledetect.py. Użyłem przykładowego wideo dostarczonego przez instalację opencv.

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__': 

    hog = cv2.HOGDescriptor() 
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 
    cap=cv2.VideoCapture('vid.avi') 
    while True: 
     _,frame=cap.read() 
     found,w=hog.detectMultiScale(frame, winStride=(8,8), padding=(32,32), scale=1.05) 
     draw_detections(frame,found) 
     cv2.imshow('feed',frame) 
     ch = 0xFF & cv2.waitKey(1) 
     if ch == 27: 
      break 
    cv2.destroyAllWindows() 

Wyniki

nie tak dobre. Jeszcze spróbować enter image description here

+0

Zrobiłeś to! Działa jak wdzięk do wideo moich ograniczeń. Widzę, że zaimplementowałeś Histogram of Gradients. Czy mógłbyś również podać linki, aby dowiedzieć się więcej o twoim kodzie? –

+1

To było w próbkach python opencv. HOG to deskryptor funkcji https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients Zasadniczo te rzeczy są bardziej złożoną wersją http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_ml/py_svm /py_svm_opencv/py_svm_opencv.html. tutaj robią to samo dla strony identyfikującej ręcznie pisane cyfry, a tutaj obiekt jest bardziej złożony. Możesz wyszukać więcej na deskryptorze HoG i SVM w google – Arijit