2012-05-10 21 views
6

Opracowałem aplikację do wykrywania twarzy za pomocą kaskadowej detekcji twarzy HAAR OpenCVs. Algorytm działa dobrze, ale co jakiś czas znajduje wzorce na ścianie lub coś, co nie jest twarzą.
Chcę uruchomić dodatkowe kontrole na obiektach podejrzanych jako twarze, ale chcę to zrobić tylko na obiektach, na których nie powiem, że są twarzami. Czy istnieje sposób na uzyskanie poziomu "zaufania" dla twarzy wykrytej przez wykrywanie kaskady HAAR?Czy istnieje sposób na pomiar poziomu zaufania podczas korzystania z wykrywania twarzy haar przy użyciu OpenCV?

Odpowiedz

3

OpenCV faktycznie znajduje więcej niż jeden wynik dla dowolnego obiektu, każdy wykryty obszar w dużej mierze pokrywa się ze sobą; są one następnie zgrupowane razem i tworzą liczbę "sąsiadów". Ta liczba to tzw. Zaufanie.

Po wykryciu obiektu jednym z parametrów jest najmniejszy sąsiad, zanim trafienie zostanie zwrócone. Zwiększenie go zmniejsza liczbę fałszywych trafień, ale także zmniejsza liczbę możliwych wykrytych twarzy.

1

Dlaczego nie uruchamiać wielu kaskad haar (wyszkolonych inaczej) na tym samym obrazie i sprawdzić, czy dają podobne wyniki? Niech głosują, tak jak to było. Tak więc gdyby tylko jedna kaskada znalazła daną twarz, a inni nie, to dawałoby mniej wiary w tę twarz.

Udało mi się uruchomić 3 kaskady jednocześnie na kanale wideo iPhone'a w czasie rzeczywistym, więc wydajność nie powinna stanowić problemu w wielu normalnych sytuacjach. Więcej tutaj: http://rwoodley.org/?p=417

5

OpenCV zapewnia zaufanie poprzez argument „wagi” w funkcji „detectMultiScale” z klasy CascadeClassifier, trzeba umieścić flagę „outputRejectLevels” do prawdziwego

+1

czy ten parametr jest dostępny dla interfejsu API openCV C++? Po prostu widzę to w API Pythona?!? Na przykład, czy istnieje nieudokumentowany sposób użycia parametru flags w tym celu? – Micka

+0

[Najwyraźniej] (http://code.opencv.org/issues/3064) jest nieudokumentowana funkcja w API C++. 'Void CascadeClassifier :: detectMultiScale (const Mat & wizerunek, Wektor i obiekty, Wektor & rejectLevels, wektor & levelWeights, podwójne scaleFactor, int minNeighbors, int flagi, wielkość minObjectSize Rozmiar maxObjectSize, bool outputRejectLevels)' – sietschie

0

Nie bezpośredniej odpowiedzi na pytanie , ale może to pomóc w ograniczeniu fałszywego wykrywania.

Możesz uzyskać mniejszą liczbę fałszywych wykrytowań, modyfikując wartości MinNeibhbours, CV_HAAR_FIND_BIGGEST_OBJECT i Size.

int MinNeighbours = 7;

face_cascade.detectMultiScale (frame_gray, faces, 1.1, MinNeighbours, CV_HAAR_FIND_BIGGEST_OBJECT, Size (60, 60));

Powiązane problemy