poniedziałek, 24 sierpnia 2009

Detekcja skóry

Dzisiaj wybiegnę trochę do przodu i pokażę detekcję skóry (będzie w zbliżającej się wersji OpenCV). Jak w wielu przypadkach, detekcję skóry przeprowadza się jedną funkcją. Na początku tworzymy odpowiedni obiekt
CvAdaptiveSkinDetector sd();

Konstruktor może przyjąć dwa parametry, poniżej wartości domyślne
CvAdaptiveSkinDetector sd(1, CvAdaptiveSkinDetector::MORPHING_METHOD_NONE);

Pierwszy z nich mówi o skali obrazu wyjściowego (np. 2 powoduje, że wynik ma dwukrotnie mniejszą szerokość i wysokość od obrazu przetwarzanego). Drugi to technika morfologiczna. Do wyboru mamy
  • MORPHING_METHOD_NONE - brak
  • MORPHING_METHOD_ERODE - erozja
  • MORPHING_METHOD_ERODE_ERODE - podwójna erozja
  • MORPHING_METHOD_ERODE_DILATE - otwarcie

Morfologia może być przydatna, gdyż całkiem dobrze redukuje szum w postaci pojedynczych porozrzucanych pikseli (zakładamy, że takie nie stanowią obszaru skóry). Analizę obrazu przeprowadzamy funkcją process
void process(IplImage *inputBGRImage, IplImage *outputHueMask);

Pierwszy parametr to obraz wejściowy, a drugi wyjściowy. Co uzyskujemy? Jest to obraz na którym wszystkie wartości powyżej zera spełniają kilka zależności i które są prawdopodobnie pikselami skóry. Tego typu detekcja opiera się na analizie kolorów obrazu (często w HSL/HSV wspieranym wstępną analizą w RGB). Powoduje to, że na wynik niekorzystnie wpływa np. niejednolite oświetlenie. Zainteresowanych techniką tego typu algorytmów odsyłam np. tutaj lub do googla, gdzie pod hasłem "skin detection" znajdziemy wiele artykułów na ten temat. Poniżej wynik działania przykładowego programu adaptiveskindetector_sample.cpp
Obraz oryginalny

Obraz wynikowy

Jak widać, działanie nie jest idealne. Przyznam, że ogólnie jestem zawiedziony "skutecznością" metody, ale może jeszcze coś poprawią :) Fajnie byłoby porównać działanie innych algorytmów znalezionych w sieci. Może coś tam skrobnę ale nie ukrywam, że ma to na razie niski priorytet :) Uaktualniłem przykład bloby.cpp na githubie, wybierając kanał "3" można się pobawić w detekcję skóry.

Brak komentarzy: