15

Używam detektora kaskadowego (cv.HaarDetectObjects) w pythonie.Zaufanie klasyfikatorów do wykrywacza twarzy opencv

na przykład:

faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2, 
    cv.CV_HAAR_DO_CANNY_PRUNING, (50,50)) 

     for f in faces: 
      print(f) 

To będzie wydrukować listę wykrytych w tej formie:

((174, 54, 114, 114), 53) 
((22, 51, 121, 121), 36) 
((321, 56, 114, 114), 21) 
((173, 263, 125, 125), 51) 
((323, 272, 114, 114), 20) 
((26, 271, 121, 121), 36) 

gdzie każda linia reprezentuje wykrycia. Pierwsze 4 cyfry to pozycja x, y lewego górnego punktu i wysokość, szerokość obwiedni. Ostatnia liczba to (powołując się na dokumentację openCV) liczbę sąsiadów.

Chyba mam dwa pytania:

1) Co oznacza ostatnia liczba oznacza? Nie mogłem znaleźć żadnego odniesienia do tego podczas googlowania.

2) (jeszcze ważniejsza) Czy istnieje sposób na uzyskanie pewności siebie za każde wykrycie? Ile wynosi klasyfikator twarzy, że wykrywanie odpowiada prawdziwej twarzy?

Dzięki

+2

może być przydatny: http://haoxiang.org/2013/11/opencv-detectmultiscale-output-detection-score/ – Shai

Odpowiedz

0

Wielkie dzięki za twoje pytanie i odpowiedź, szukałem wykrycia twarzy opencv z oceną pewności na jeden dzień. Twoje pytanie i odpowiedź dostarczają wskazówek, jak rozwiązać problem.

Tak jak powiedział Palmstrom, ostatnia liczba oznacza liczbę pozycji obiektu w tej grupie. i możesz użyć tego jako wyniku zaufania.

O ile mi wiadomo, istnieje tylko taki rodzaj API w starym API Pythona. Nowy interfejs API nie ma tej wartości (numer obiektu w klastrze).

Umieszczam tutaj mój kod na wypadek, gdyby pomógł on innym osobom. Jest to stary interfejs API python, którego samouczek jest trudny do znalezienia.

import sys 
import cv 

def detect_face(image): 
    image_size = cv.GetSize(image) 
    # # create grayscale version 
    grayscale = cv.CreateImage(image_size, 8, 1) 
    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY) 
    # # equalize histogram 
    cv.EqualizeHist(grayscale,grayscale) 

    #parameters to the detection function  
    cascade = cv.Load('haarcascade_frontalface_alt.xml') 
    haar_scale = 1.1 
    min_neighbors = 3 
    haar_flags = cv.CV_HAAR_DO_CANNY_PRUNING 
    min_size = (30,30) 

    faces = cv.HaarDetectObjects(grayscale, cascade, cv.CreateMemStorage(0), 
           haar_scale, min_neighbors, haar_flags, min_size) 

    print faces 

    if len(faces) > 0: 
     print '=> ' + str(len(faces)) + ' face detected!' 
     for ((x,y,width,height), n) in faces: 
      pt1 = (x,y) 
      pt2 = (x + width, y + height) 
      cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 


if __name__ == '__main__': 

    filename = sys.argv[1] 
    image = cv.LoadImage(filename,cv.CV_LOAD_IMAGE_COLOR); 
    detect_face(image) 

    cv.ShowImage("cam", image) 
    cv.WaitKey(0)