2015-03-11 17 views
9

Uso un classificatore opencv in cascata per rilevare le mani nei fotogrammi video e desidero abbassare il tasso di falsi positivi. Leggendo la rete, ho visto che è possibile farlo accedendo alle informazioni rejectLevels e levelWeights restituite dal metodo detectMultiScale. Ho visto here che questo è possibile in C++, la mia domanda è: qualcuno è riuscito a farlo in Python? Una domanda simile è stata richiesta here ma era per una versione precedente del metodo di rilevamento.Ottenere il livello di confidenza di detectMultiscale in OpenCV con Python?

Se è possibile, qual è la sintassi corretta per chiamare il metodo? Se ha funzionato per te, menziona la versione OpenCV che stai utilizzando. Sono al 2.4.9.

Il 2.4.11 API fornisce la seguente sintassi

Python: cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]]) 

Quindi di conseguenza, ho cercato

import cv2 
import cv2.cv as cv 
import time 
hand_cascade = cv2.CascadeClassifier('cascade.xml') 
img = cv2.imread('test.jpg') 

rejectLevels = [] 
levelWeights = [] 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
faces = hand_cascade.detectMultiScale(gray,rejectLevels,levelWeights, 1.1, 5,cv.CV_HAAR_FIND_BIGGEST_OBJECT,(30, 30),(100,100),True) 

Ma l'uscita ottengo è

[[259 101 43 43] 
[354 217 43 43] 
[240 189 43 43] 
[316 182 47 47] 
[277 139 92 92]] 
[] 
[] 

Grazie per il help,

Ronen

risposta

1

A parte l'hacking del C++, non sembra che ci sia un modo per ottenere i respettivi effettivi Livello e livello.

7

Per chi viene a questa domanda e utilizza OpenCV 3.0 ho lavorato dopo aver esplorato l'API python.

Sul classificatore a cascata ci sono tre metodi detectMultiScale, detectMultiScale2 e detectMultiScale3. Usando il terzo, sono stato in grado di ottenere quello che sembrava una fiducia/peso.

faces = faceCascade.detectMultiScale3(
    gray, 
    scaleFactor=1.1, 
    minNeighbors=5, 
    minSize=(30, 30), 
    flags = cv2.CASCADE_SCALE_IMAGE, 
    outputRejectLevels = True 
) 
rects = faces[0] 
neighbours = faces[1] 
weights = faces[2] 

weights[i] guarda per abbinare la fiducia del volto definito da rects[i]. neighbours[i] è il numero di corrispondenze in prossimità del rettangolo corrente.

+0

detectMultiScale3 non ha funzionato per me. detectMultiScale2 restituisce intensità (o confidenza) come una seconda var. – thecheech