instrukcję

Transkrypt

instrukcję
ANALIZA I INDEKSOWANIE
MULTIMEDIÓW (AIM)
LABORATORIUM 5 - LOKALIZACJA OBIEKTÓW METODĄ HISTOGRAMU KOLORU
1. WYBÓR LOKALIZOWANEGO OBIEKTU
Pierwszy etap laboratorium polega na wybraniu lokalizowanego obiektu. Musi wyróżniać się on kolorem od
otaczającego tła. Może to być twarz, ręka, zeszyt czy dowolny inny znacznik.
2. ZBUDOWANIE DWUWYMIAROWEGO HISTOGRAMU KOLORÓW NA PODSTAWIE
DANYCH TRENUJĄCYCH
Dane trenujące: w sekwencji obrazów na bieżąco analizowanych z kamery podłączonej do komputera, należy
zaznaczyć K (K = 10) obszarów obejmujących dany obiekt, jak na rysunku 1.
Rysunek 1
Histogram: na podstawie pikseli leżących w zaznaczonych obszarach należy zbudować dwuwymiarowy
histogram o rozmiarze 16x16 dla składowych barwy r, b, gdzie:
natomiast indeksy w histogramie, jak to pokazano na rysunku 2, określone są jako i r=min(15, r*16), ib=min(15,
b*16), ir i ib zredukowane do przedziału 0..15.
Rysunek 2: Histogram kolorów.
Dla każdego piksela Nk należącego do zaznaczonych K obszarów, należy kolejno inkrementować wartości w
komórkach histogramu L[ir, ib] o odpowiadającym im kolorze.
Następnie histogram powinien zostać znormalizowany tak, aby suma komórek dawała 1. W tym celu wartości
wszystkich komórek L[ir, ib] należy podzielić przez łączną sumę pikseli we wszystkich zaznaczonych obszarach.
Ustalić próg YT określający wartość odcięcia pikseli obiektu, np. jako wartość średnia komórek histogramu
pomnożona przez wybrany współczynnik (można eksperymentować z progiem).
3. GRAFICZNE PRZEDSTAWIENIE ZAWARTOŚCI HISTOGRAMU
Należy umożliwić graficzne wyświetlenie zawartości histogramu (na przykład jako obraz 2D w odcieniach
szarości) w oknie aplikacji.
4. LOKALIZACJA OBIEKTU PRZY POMOCY HISTOGRAMU KOLORU
W każdej klatce obrazu kamery należy zaetykietować piksele mające kolor odpowiadający kolorowi obiektu
przy pomocy uzyskanego histogramu. Efekt ten można uzyskać poprzez algorytm iteracyjny (jak poniżej) lub
rozrostowy, tak jak było to opisane na wykładzie.
Krok 1)
Zbudować obraz binarny B(x, y) badanego zdjęcia: najpierw zbudować obraz w odcieniach szarości, przypisując
każdemu pikselowi luminancję Y(x, y), uzyskaną jako wartość komórki histogramu odpowiadającą kolorowi
piksela pomnożoną przez 255, a następnie przypisać temu pikselowi wartość 1 jeżeli Y(x,y) jest większe od
progu YT, albo wartość 0 w przeciwnym przypadku, czyli:
ir(x,y) = min(15, r(x, y)*16);
ib(x,y) = min(15, b(x,y)*16);
ir i ib zredukowane do przedziału 0..15.
Y(x,y) = L[ir(x,y), ib(x,y)]*255;
If (Y(x,y) > YT) B(x, y)=1;
else B(x, y)=0;
gdzie x,y oznaczają indeksy przeglądania obrazu w kierunku poziomym i pionowym, piksele zaznaczone jako
jeden traktujemy jako „czarne”, a piksele zaznaczone jako 0 są pikselami tła („białe”).
Krok 2)
Znaleźć spójne przestrzennie obszary pikseli w utworzonym obrazie binarnym. Można to zrobić za pomocą
przedstawionego poniżej algorytmu. Algorytm ten przypisuje etykiety pikselom w ten sposób, aby piksele
należące do tych samych obszarów miały te same etykiety.
Zaznaczyć na oryginalnym obrazie obszary odpowiadające zlokalizowanym obiektom. Narysować prostokąty
obejmujące poszczególne obszary o tych samych etykietach.
5. ETYKIETOWANIE OBSZARÓW SPÓJNYCH OBRAZU BINARNEGO (KROK 2 POWYŻEJ)
W pierwszej kolejności należy przypisać pikselom „czarnym” (obraz binarny utworzony w pierwszym kroku)
etykiety, w ten sposób, aby kolejne wykryte obszary spójne miały inne etykiety, zaczynając od wartości
minimalnej do maksymalnej. W tym celu należy przeglądać obraz wierszami od lewej do prawej i od góry do
dołu, i jeżeli:
- dla piksela czarnego w sąsiedztwie pikseli wcześniej przeglądanych, pokazanych na rysunku 3, występuje
piksel zaetykietowany, to przypisać etykietę piksela z sąsiedztwa mającą minimalną wartość;
- w przeciwnym przypadku przypisać wartość większą o jeden od największej użytej dotychczas etykiety –
wartość etykiety maksymalnej musi być pamiętana.
Rysunek 3. Sąsiedztwo pikseli wcześniej przeglądanych. Piksel bieżący zaznaczony kolorem czerwonym, piksele
sąsiednie szarym.
Na tym etapie może wystąpić połączenie obszarów o innych etykietach. Aby zniwelować ten efekt, należy
przeprowadzić następny etap etykietowania – iteracyjnej zmiany etykiet. Należy przeglądać obraz od lewej do
prawej i z góry do dołu. Dla każdego piksela czarnego badać sąsiedztwo 8 przyległych pikseli przedstawione na
rysunku 4. Jeżeli w tym sąsiedztwie występuje piksel czarny o niższej etykiecie to przypisać najniższą etykietę z
tego sąsiedztwa pikselowi bieżącemu. Powtarzać iteracyjnie procedurę przeglądania obrazu dotąd, aż w całej
iteracji przeglądania obrazu żadna etykieta nie będzie zmieniona. W efekcie powinny powstać spójne obszary,
w których czarne piksele przyległe mają jednakowe etykiety, natomiast rozłączne obszary mają inne etykiety.
Przy implementacji powyższych algorytmów należy pamiętać o odpowiednim traktowaniu pikseli brzegowych
(nie maja one wszystkich sąsiadów).
Rysunek 4. Sąsiedztwo pikseli przyległych. Piksel bieżący zaznaczony kolorem czerwonym, piksele sąsiednie
szarym.
6. UWAGI DO ZAŁĄCZONEJ APLIKACJI (KAMERA)
Załączona do treści laboratorium aplikacja pozwala na wykorzystanie kamery podłączonej do komputera.
Jednocześnie dostarcza kilku narzędzi przydatnych w czasie wykonywania laboratorium.
Do poprawnej kompilacji programu wymagane jest Visual Studio w wersji minimum 2010 (dostępne w
Dreamspark). W przypadku korzystania z Visual Studio w wersji 2013 proszę pamiętać, że musi być
doinstalowany pakiet multibyte character set (MBCS), można go zawsze doinstalować ze strony producenta.
Program nie będzie działał dla wersji Express ze względu na brak MFC przy pomocy którego stworzone jest
środowisko graficzne aplikacji!
Po wczytaniu aplikacji w środowisku Visual Studio (Kamera.sln) należy najpierw spróbować uruchomić program
(F5 lub Debug->Start Debugging). Jeśli po wybraniu odpowiedniej kamery przechwytywany obraz wyświetlany
jest na ekranie, oznacza to że wszystko zostało wykonane poprawnie i można przystąpić do realizacji ćwiczenia.
Należy modyfikować pliki ImageProcessing.cpp i ImageProcessing.h. W klasie ImageProcessing znajdują się
następujące elementy do implementacji:
ImageProcessing(); – konstruktor domyślny. Tutaj należy umieszczać inicjalizacje zmiennych klasy
~ImageProcessing(); – destruktor klasy.
void ZeroVariables(); - funkcja ustawiająca początkowe parametry zmiennych (np. wskaźniki na NULL)
void ProcessRGBImage(int mode, unsigned char *rgb_image, int w, int h); - funkcja przetwarzania pikseli.
Wywoływana za każdym razem, gdy z kamery otrzymywana jest kolejna klatka obrazu. Tablica rgb_image
(wielkości w*h*3 bajty) odpowiada pikselom wyświetlanym na panelu programu. Piksele ustawione są rzędami.
Każdy piksel opisany jest przez 3 bajty – wartości składowej niebieskiej, zielonej i czerwonej (BGR). Funkcja
wywołuje zależnie od trybu funkcję Mode1Processing, Mode2Processing lub Mode3Processing
mode – tryb przetwarzania obrazu (0, 1, 2) ustawiany automatycznie przez wybór odpowiedniego menu z
zakładki modes.
rgb_image – otrzymana z kamery klatka obrazu.
w, h – szerokość i wysokość obrazu
void ServiceDrawnRectangle(CRect rect, unsigned char *rgb_image, int w, int h); - funkcja wywoływana za
każdym razem, gdy w obrazie zaznaczony zostanie prostokąt.
rect – współrzędne zaznaczonego prostokąta (posiada m.in. składowe left, right, top, bottom),
rgb_image – ostatni z obrazów uzyskany z kamery wideo (wielkości w*h*3 bajty)
w, h – szerokość i wysokość tego obrazu
Obraz z kamery rgb_image jest obrócony względnej współrzędnej y (pierwszy element tablicy odpowiada
pierwszemu pikselowi ostatniego wiersza obrazu). Dostęp do składowych RGB piksela obrazu o współrzędnych
(x, y) otrzymujemy poprzez:
R = rgb_image[(x + (h-y-1)*w)*3 + 2];
G = rgb_image[(x + (h-y-1)*w)*3 + 1];
B = rgb_image[(x + (h-y-1)*w)*3];
Funkcję Mode1Processing można zaimplementować jako lokalizację obiektu. W funkcji Mode2Processing
można zaimplementować wyświetlanie zawartości histogramu. Zakładka menu „Camera properties” działa
jedynie dla trybu kompilacji Release. Prostokąt może być wyświetlany poprzez funkcję DrawRectangleRGB a
punkt przez DrawPixel. W zaimplementowanych metodach jest przykład ich użycia.
Uwaga!
Aplikacja ma charakter przykładowy i nie ma obowiązku jej wykorzystania. Język programowania wykorzystany
do wykonania zadania laboratoryjnego jest dowolny. Liczy się samodzielność wykonanych zadań.

Podobne dokumenty