2015-03-11 10 views
9

Używam wyszkolonego klasyfikatora kaskadowego opencv do wykrywania rąk w klatkach wideo i chciałbym obniżyć moją fałszywą pozytywną stawkę. Czytanie w sieci, widziałem, że możesz to zrobić, uzyskując dostęp do informacji zwracanych przez metodę detectMultiScale. Widziałem here, że jest to możliwe w C++, moje pytanie brzmi - czy ktokolwiek zdołał to zrobić w Pythonie? Podobne pytanie zostało zadane here, ale dotyczyło to wcześniejszej wersji metody wykrywania.Uzyskanie poziomu pewności detektora MULTiscale w OpenCV za pomocą Pythona?

Jeśli jest to możliwe, jaka jest właściwa składnia, aby wywołać metodę? Jeśli to zadziałało, podaj wersję OpenCV, z której korzystasz. Jestem na 2.4.9.

2.4.11 API daje następującą składnię

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

więc odpowiednio, próbowałem

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) 

Ale wyjście mogę to

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

Dzięki za pomoc,

Ronen

Odpowiedz

1

Krótko od zhakowania C++, nie wygląda na to, że istnieje jakikolwiek sposób na uzyskanie rzeczywistej wartości rejectLevels i levelweights.

7

Dla każdego, kto przyszedł na to pytanie i korzystał z OpenCV 3.0, opracowałem grę po interfejsie API Pythona.

Na klasyfikatorze kaskadowym dostępne są trzy metody: detectMultiScale, detectMultiScale2 i detectMultiScale3. Korzystając z trzeciej, udało mi się uzyskać coś, co wyglądało na pewność siebie/wagę.

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] stara się dopasować zaufanie wobec określonej przez rects[i]. neighbours[i] to liczba dopasowań w sąsiedztwie bieżącego prostokąta.

+0

detectMultiScale3 nie działa dla mnie. detectMultiScale2 zwraca intensywności (lub zaufanie) jako drugi var. – thecheech

Powiązane problemy