2015-03-11 14 views
9

Ich verwende einen trainierten opencv Kaskadenklassifikator, um Hände in Videorahmen zu erkennen, und möchte meine falsche positive Rate senken. Lesen Sie im Internet, sah ich Sie können dies durch den Zugriff auf die rejectLevels und levelWeights Informationen, die von der Methode detectMultiScale zurückgegeben. Ich sah here, dass dies in C++ möglich ist, meine Frage ist - hat es jemand geschafft, es in Python zu tun? Eine ähnliche Frage wurde gestellt here, aber es war für eine frühere Version der Erkennungsmethode.Ermitteln der Vertrauensstufe von detectMultiscale in OpenCV mit Python?

Wenn es möglich ist, was ist die richtige Syntax, um die Methode aufzurufen? Wenn es für Sie funktioniert, erwähnen Sie bitte die von Ihnen verwendete OpenCV-Version. Ich bin am 2.4.9.

Die 2.4.11 API gibt die folgende Syntax

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

So dementsprechend habe ich

versucht
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) 

Aber der Ausgang ich erhalte, ist

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

Vielen Dank für die Hilfe,

Ronen

Antwort

1

Kurz vor dem Hacken des C++, sieht es nicht so aus, als gäbe es keine Möglichkeit, die tatsächlichen rejectLevels und levelWeights zu bekommen.

7

Für jeden, der zu dieser Frage kommt und OpenCV 3.0 verwendet, habe ich nach dem Stöbern in der Python-API gearbeitet.

Am Kaskadenklassifizierer gibt es drei Methoden detectMultiScale, detectMultiScale2 und detectMultiScale3. Mit der dritten konnte ich etwas bekommen, das wie ein Vertrauen/Gewicht aussah.

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] sieht das Vertrauen des Gesichts durch rects[i] definiert entsprechen. neighbours[i] ist die Anzahl der Übereinstimmungen in der Nachbarschaft des aktuellen Rechtecks.

+0

detectMultiScale3 hat nicht für mich funktioniert. detectMultiScale2 gibt Intensitäten (oder Konfidenz) als zweite Var zurück. – thecheech