Witam po długiej przerwie. Już wiele razy pisałem o tym co planuję, wiele pomysłów na tego bloga przechodziło przez myśl. Ostatecznie wyszło tak, że nie pisałem nic. Więc porzucam te wszystkie pomysły i pisać będę krótsze notki, może częściej, może rzadziej, ale przynajmniej blog będzie dawał czasami znak życia :)
Dzisiaj powraca temat detekcji skóry, ponieważ ostatnio dość mocno nad tym pracuję. Jak kiedyś o tym wspomniałem, najprostsze techniki opierają się o proste zależności między wartościami odpowiednich kanałów obrazu. Dzisiaj jedna z takich metod dająca zaskakująco dobre wyniki (zwłaszcza po zastosowaniu erozji ;). Jej opis znajdziemy tutaj pod tytułem "Human Skin Colour Clustering for Face Detection". Nie owijając w bawełnę, poniżej kod.
Dzisiaj powraca temat detekcji skóry, ponieważ ostatnio dość mocno nad tym pracuję. Jak kiedyś o tym wspomniałem, najprostsze techniki opierają się o proste zależności między wartościami odpowiednich kanałów obrazu. Dzisiaj jedna z takich metod dająca zaskakująco dobre wyniki (zwłaszcza po zastosowaniu erozji ;). Jej opis znajdziemy tutaj pod tytułem "Human Skin Colour Clustering for Face Detection". Nie owijając w bawełnę, poniżej kod.
IplImage* process(IplImage* img) { IplImage * toRet = cvCreateImage(cvGetSize(img), 8, 1); for (int y = 0; y < img->height; y++) { uchar* ptr = (uchar*) (img->imageData + y * img->widthStep); uchar* ptrRet = (uchar*) (toRet->imageData + y * toRet->widthStep); for (int x = 0; x < img->width; x++) { double b, g, r; b = ptr[3 * x]; g = ptr[3 * x + 1]; r = ptr[3 * x + 2]; double min = b; double max = b; if (min > g) min = g; if (min > r) min = r; if (max < g) max = g; if (max < r) max = r; if (r <= 95 || g <= 40 || b <= 20 || max - min <= 15 || fabs(r - g) <= 15 || r <= g || r <= b) { ptrRet[x] = 0; } else { ptrRet[x] = 255; } } } cvErode(toRet,toRet,NULL,1); return toRet; }W komentarzach możecie podzielić się "wrażaniami" :) U mnie na jednej kamerce działa świetnie, na drugiej gorzej niż średnio :) Wynik działania:
Światło | Kamera 1 | Kamera 2 |
Naturalne | ![]() | ![]() |
Sztuczne | ![]() | ![]() |
Naturalne + Sztuczne | ![]() | ![]() |
5 komentarzy:
Szkoda, że nie urozmaiciłeś całości o screeny porównawcze z obu kamerek (a może przekonam Cię, i jeszcze je dodasz?). Postaram się za parę dni sprawdzić jak to zadziała z moimi kamerkami.
Dodałem :) Porównałem też jak wpływa oświetlenie w moim niewielkim pokoju.
No no, na pierwszej kamerze, ze sztucznym oświetleniem naprawdę niezły wynik :)
Dokładnie :) Dodam, że mam pomarańczowe ściany, więc tym bardziej efekt na pierwszej kamerze zadowala :)
Cóż, moja jedna kamerka uległa chyba uszkodzeniu, na matrycy pełno syfu, może to tylko jakieś pyłki ale nie mogę się ich na razie pozbyć. Natomiast kamerka wbudowana w laptopa http://dl.dropbox.com/u/1012731/zdjecia/result.png oświetlana 24W energooszczędną żarówką jakiś metr nad głową i pół metra w tył. Największe plamy nie będące skórą to drzwi i włącznik światła. Efekt oceniam jako gdzieś pomiędzy Twoimi.
Prześlij komentarz