Professional Documents
Culture Documents
PRACA MAGISTERSKA
SEBASTIAN WOJAS
PROMOTOR:
DR P AWE ROTTER
KRAKW 2010
_________________
PODPIS
MSc THESIS
SEBASTIAN WOJAS
PROMOTOR:
DR P AWE ROTTER
KRAKW 2010
PODZIKOWANIA
Z GBI SERCA DZIKUJE SWOIM RODZICOM
DANUCIE I ANDRZEJOWI WOJAS ZA TRUD JAKI
WOYLI W MOJE WYCHOWANIE ORAZ ZA
MDROD , DZIKI KTREJ YCIE STAO SI
ATWIEJSZE .
PROMOTOROWI
ROTTEROWI
ZA
DOKTOROWI
POMOC
PAWOWI
PODJCIU
Spis Treci
1.
2.
Wstp ................................................................................................................................... 8
1.1
1.2
1.3
1.4
1.4.1
1.4.2
1.4.3
Dokumentacja ................................................................................................................ 14
1.4.4
2.1.1
2.1.2
2.1.3
2.2
2.2.1
2.2.2
2.3
2.3.1
2.3.2
2.3.3
2.3.4
Obsuga myszy................................................................................................................ 30
2.3.5
2.4
3.
2.4.1
2.4.2
2.4.3
2.4.4
Operacje macierzowe..................................................................................................... 36
2.4.5
2.4.6
Wstawianie tekstu.......................................................................................................... 39
Progowanie ............................................................................................................................40
5
3.2
3.3
3.3.1
Filtr Sobela...................................................................................................................... 46
3.3.2
3.3.3
3.4
3.4.1
3.4.2
3.4.3
3.4.4
Rysowanie konturw...................................................................................................... 55
3.5
Rozmycie ................................................................................................................................56
3.6
3.6.1
3.6.2
Wykrywanie okrgw..................................................................................................... 62
3.7
3.8
Histogramy .............................................................................................................................70
3.9
3.9.1
3.9.2
3.10
4.
Kontury ...................................................................................................................................51
Realizacja praktyczna........................................................................................................... 87
4.1
4.1.1
Realizacja ........................................................................................................................ 87
4.1.2
Problemy ........................................................................................................................ 88
4.1.3
4.1.4
Obsuga programu.......................................................................................................... 92
4.1.5
Moliwod rozwoju......................................................................................................... 94
4.2
Face Detect.............................................................................................................................95
4.2.1
Realizacja ........................................................................................................................ 95
4.2.2
Problemy ........................................................................................................................ 95
4.2.3
4.2.4
4.3
4.3.1
5.
4.3.2
4.3.3
4.3.4
Podsumowanie.................................................................................................................. 105
1. Wstp
1.1
Cele i zaoenia
Gwnym celem tego opracowania jest ukazanie moliwoci jakie daje biblioteka OpenCV
w procesie tworzenia systemw detekcji i analizy obrazu. Na podstawie zagadnieo zawartych w
pracy zostay stworzone programy pokazujce funkcjonalnod biblioteki pod wzgldem analizy
ruchu, detekcji obiektw oraz przetwarzania sekwencji wideo.
1.2
Zawarto pracy
Niniejsza praca skada si z piciu rozdziaw.
Rozdzia 1 opisuje gwne cele pracy oraz jej tematyk. Stanowi rwnie wstp do
cyfrowego przetwarzania obrazw (1.3). Prezentuje bibliotek OpenCV (1.4) pod ktem historii
jej rozwoju, wsparcia technicznego, architektury oraz sposobu instalacji na komputerze
z zainstalowanym systemem Windows oraz oprogramowaniem Visual Studio C++ 2010 Express.
Rozdzia 2 jest przedstawieniem podstawowych narzdzi biblioteki OpenCV,
niezbdnych do analizy i przetwarzania obrazw. Zawiera midzy innymi opis typu danych
(2.1), pracy z obrazami (2.2), tworzenia GUI (2.3) oraz podstawowych operacji na obrazach
(2.4).
Rozdzia 3 powicony jest w caoci metodom przetwarzania obrazw, pod ktem
teoretycznym oraz ich implementacji z wykorzystaniem funkcjonalnoci OpenCV. Opisuje
metody progowania (3.1), detekcji krawdzi (3.3), wykrywania konturw (3.4) Zawiera
operacje rozmycia (3.5), przeksztacenia morfologiczne (3.6), wykorzystanie transformaty
Hougha (3.7) oraz histogramw (3.8). Rozdzia ten jest rwnie swoistym wprowadzeniem do
analizy obrazw pod ktem ruchu (3.9) oraz ledzenia obiektw (3.10). Wikszod
z wymienionych zagadnieo w celu lepszego zrozumienia zasady dziaania, oparta jest
o realizacje programowe pokazujce ich moliwoci.
Rozdzia 4 jest czci programow, wykorzystujc poznane we wczeniejszych
rozdziaach techniki analizy obrazw do tworzenia rozbudowanych systemw wizyjnych.
Przedstawia interaktywny interfejs Finger Draw wykorzystywany do rysowania obiektw
geometrycznych (4.1). Opisuje rwnie implementacj systemu detekcji twarzy Face Detect
z wykorzystaniem metody Haar-Like (4.2) oraz systemu analizy drogi Line Assist (4.3).
Rozdzia 5 jest podsumowaniem zrealizowanych zagadnieo pod ktem funkcjonalnym
oraz rozwojowym.
W Dodatku znajduje si kod oprogramowania uyty do stworzenia systemw
opisanych w rozdziale 4.
1.3
1.4
OpenCV (Open Source Computer Vision library) jest bezpatn, open-sourceow bibliotek
do uytku komercyjnego i edukacyjnego, bez koniecznoci udostpniania swoich projektw
opartych o jej implementacj. Zostaa napisana w jzyku C i C++ i rozwijana jest za pomoc
wrapperw w wielu jzykach programowania takich jak C#, Python, Ruby, Matlab czy Java.
Posiada wielu uytkownikw na caym wiecie doskonaym przykadem jest grupa
tematyczna o OpenCV na portalu Yahoo, ktra aktualnie posiada ponad 48.000 uytkownikw.
Biblioteka ta zostaa stworzona na potrzeby aplikacji czasu rzeczywistego gdzie wydajnod
obliczeniowa programw jest bardzo istotna. Napisana jest w zoptymalizowanym jzyku C/C++
i wykorzystuje moliwoci jakie daj popularne od kilku lat procesory wielordzeniowe.
Jednym z gwnych celw biblioteki OpenCV jest dostarczenie narzdzia, ktre pozwoli
tworzyd zarwno proste programy jak rwnie zaawansowane projekty ludziom z rnym
poziomem wiedzy na temat programowania i przetwarzania obrazw. Amatorzy za pomoc
OpenCV i kamery internetowej mog poznawad elementy przetwarzania obrazw w zakresie:
wykrywania krawdzi, segmentacji czy filtracji obrazw bez wikszego wysiku. Za sami
specjalici nie musz powicad czasu na pisanie bazowych funkcji w zaawansowanych
9
projektach nigdy wicej wymylania koa! Moliwe jest to dziki wbudowanym w bibliotek
ponad 500 funkcjom, ktre obejmuj wiele obszarw komputerowej wizji takich jak robotyka,
stereowizja, bezpieczeostwo, analiza obrazw medycznych czy kalibracja kamery. Wiele
projektw wykorzystujcych zdjcia z lotu ptaka czy mapowanie ulic takie jak Google
Maps, czy Google Streets View, wykorzystuje kalibracje kamery oraz metody zszywania
obrazw, ktre s czci OpenCV. Bezzaogowe samoloty, urzdzenia do detekcji obiektw
czy ukady monitoringu rwnie oparte s o wizje komputerow.
Inspiracj do zgbienia tematyki OpenCV by artyku Innovations from a robot rally w
SCIENTIFIC AMARICAN[1] o wycigu Grand Challange przeznaczony dla autonomicznych
pojazdw. Wycig odby si w padzierniku roku 2005, a organizatorem bya amerykaoska
agencja DARPA, zajmujca si rozwojem technologii wojskowej. Samochd Stanley
Volkswagen Touareg przejecha samodzielnie tras 212 km po pustyni Mojave oraz poudniu
Las Vegas w czasie 6 godzin i 54 minut. Jedn z gwnych rl przy projektowaniu systemu
wizyjnego odegraa wanie biblioteka OpenCV.
1.4.1
Pocztki OpenCV sigaj kooca lat 90. W tamtych latach korporacja Intel rozpocza kilka
projektw opartych o prace w czasie rzeczywistym takich jak ledzenie promieni oraz
wywietlanie obiektw 3D na cianie. Jeden z autorw tych projektw wizytujc w tym czasie
amerykaoskie uniwersytety zauway, e kilka grup uniwersyteckich takich jak MIT Media Lab
z MIT w Massachusetts posiada wiele rozbudowanych narzdzi do przetwarzania obrazw,
ktre byy propagowane i jednoczenie udoskonalane przez studentw. Wanie przy
wsppracy tych grup oraz pomocy Intels Performance Library Team zostao stworzone jdro z
zaimplementowanym kodem oraz specyfikacj algorytmw. Dane te zostay przesane do
Intels Russian Library Team w Niszym Nowogrodzie w Rosji gdzie wanie powstaa
biblioteka OpenCV.
Gwnymi celami OpenCV jakie zostay zaoone w trakcie jej budowania byo stworzenie
darmowego, otwartego i zoptymalizowanego kodu dla podstawowych funkcji przetwarzania
obrazw. Kod ten musia byd czytelny i atwy do przenoszenia, gdy by podstaw dla
deweloperw, ktrzy mieli go rozwijad[W1].
Mona by si zastanawiad dlaczego Intel stworzy bardzo pomoc bibliotek dla
deweloperw cakowicie za darmo. Idea bya bardzo prosta wykorzystanie tej biblioteki
pomagao w projektowaniu aplikacji wymagajcych duej mocy obliczeniowej, a tym samym
szybkich procesorw. Sprzeda komponentw firmy Intel bya bardziej opacalna ni
wypuszczenie na rynek dodatkowego oprogramowania. Pomys mg byd zrealizowany tylko
przy duej popularnoci tej biblioteki. Intel nie pomyli si z prognozami do tej pory ze strony
projektu[W2] biblioteka OpenCV zostaa cignita 2.858.950 razy, co stanowi 40.5 TB danych!
10
1.4.2
Pobieranie i instalacja
11
12
<cv.h>
<cxcore.h>
<highgui.h>
<cvaux.h>
1.4.3
Dokumentacja
1.4.4
Architektura OpenCV
14
2. Podstawy OpenCV
2.1
Typy danych
Przed opisem typw danych musimy zdad sobie spraw jak dane te s reprezentowane
w pamici komputera. Przyjta konwencja matematycznego opisu obrazw zakada, e obraz
jest macierz. Elementy macierzy, w zwizku z liniowym charakterem pamici komputera s
cigiem liczb. OpenCV rwnie przyjo ten sposb reprezentacji. Obrazy poddawane
algorytmom przetwarzania obrazw konwertowane s do skali szaroci. Dlatego wartoci
macierzy przyjmuj wartoci od 0 do 255 dla skali szaroci (reprezentacja odcieni szaroci), lub
od 0 do 1 dla postaci binarnej obrazu, gdzie zazwyczaj, 0 kolor czarny, 1 kolor biay).
W przypadku obrazw kolorowych elementy macierzy przyjmuj trzy wartoci (w zalenoci od
przestrzeni kolorw), wyjtkiem jest model przestrzeni RGBA, ktry posiada czwarty parametr
kana alpha, pozwalajcy na uzyskanie efektu przeroczystoci.
[
],
2.1.1
kolorw, tzn. e mog przyjmowad one kilka wartoci. Oglny schemat typu elementw
macierzy wyglda nastpujco: CV_<bit_depth>(S/U/F)C<channel_numebers>, tzn. typ
CV_32FC3 opisuje elementy bdce trjkami liczb cakowitych bez znaku. (czyli piksele o gbi
32 bitw w przestrzeni np. RGB).
Konstrukcja struktury nie jest zbyt rozbudowana posiada takie parametry jak szerokod,
wysokod, typ elementw macierzy, dugod wiersza wyraon w bitach oraz wskanik do
tablicy typw danych. Poniej przedstawiona jest pena definicja struktury:
typedef struct CvMat {
int type; // typ elementw macierzy
int step; // dugo wiersza macierzy
int* refcount;
union {
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
// wskaniki do danych
union {
int rows;
int height;
};
union {
int cols;
//ilo wierszy
int width; //ilo kolumn
};
} CvMat;
Argumentami funkcji s wymiary macierzy oraz typ danych elementw w niej zawartych.
Wspomnian
depth tzw. gbia, czyli ilod bitw na piksel. Przyjmuje nastpujce wartoci:
Typ CvArr mona traktowad jak klas abstrakcyjn, wykorzystywany jest tylko jako
parametr funkcji, ktry pozwala na wykorzystanie tej funkcji przy pracy z obiektami innych
typw (np. CvMat lub IplImage).
2.1.2
Wszystkie wczeniej omawiane typy danych byy strukturami statycznymi, tak wic naley
teraz wspomnied o jednej z podstawowych i bardzo czsto wykorzystywanych dynamicznych
struktur danych, jak jest CvSeq. Obiektem tego typu s sekwencje, ktre mog byd alokowane
w bloku pamici (ang. memory storage), co stanowi jedn z metod obsugi alokacji pamici dla
dynamicznych obiektw.
Bloki pamici tworz list w taki sposb, i pozwala to na alokacj i dealokacj pamici dla
cigych zestaww blokw. Wiele funkcji zaimplementowanych w OpenCV wymaga tego
1
2
18
gdzie parametrami s: *storage wskanik na blok pamici oraz t_size, czyli rozmiar
buforu, ktry nie moe byd wikszy ni wskazany blok pamici. Sam blok pamici tworzy jest
za pomoc funkcji:
CvMemStorage* cvCreateMemStorage(int blocksize),
gdzie parametrem jest rozmiar bloku. Domylnie wartod blocksize rwna jest zero,
w tym przypadku alokowane zostaje 64kB pamici. Funkcja ta zwraca wskanik na pocztek
stworzonego bloku. W momencie gdy przydzia pamici nie jest ju potrzebny, zwalniamy go
za pomoc funkcji:
void cvRealseMemStorage(cvMemStorage** storage)
19
Parametry tej funkcji zostay opisane powyej. Jeeli chcemy modyfikowad sekwencj przez
dodanie lub usunicie elementw korzystamy z nastpujcych funkcji3:
cvSeqPush() dodawanie elementu do kooca sekwencji,
cvSeqPop() usuwanie elementu z kooca sekwencji,
cvSeqPushFront() dodawanie elementu na pocztku sekwencji,
cvSeqPopFron() usuwanie elementu z pocztku sekwencji,
cvSeqInsert() dodaje elementy do wntrza sekwencji,
cvSeqRemove() usuwa elementy z wntrza sekwencji.
Jeeli chcemy usund sekwencj uywamy funkcj cvClearSeq(). Naley jednak pamitad,
e w momencie usuwania sekwencji, nie zostanie zwolniona pamid na ni przydzielona
w bloku pamici. Zaalokowana pamid moe byd ponownie uyta tylko przez t usunit
sekwencj. Pamid z bloku pamici naley wyczycid za pomoc wspomnianej wczeniej funkcji
cvClearMemStorage().
Istniej jeszcze inne dynamiczne struktury danych takie jak: CvSet, CvGraph,
CvTreeNodeIterator lecz nie bd one opisane, w zwizku z brakiem ich wykorzystania
w moich projektach. Szczegowe informacje na ich temat mona znaled w dokumentacji
OpenCV.
Nie zostan opisane deklaracje funkcji, gdy nie ma takiej potrzeby. Pene deklaracje mona znaled w
dokumentacji OpenCV
20
2.1.3
//cvPoint(int x, int y)
Zmienna size typu CvSize przyjmuje parametry szerokod 80 pikseli, wysokod 40 pikseli.
//cvRect(int x,y,width,height)
Zmienna rect typu CvRect jest prostoktem zaczepionym w punkcie *10,10+ o wymiarach
szerokod 80 pikseli, wysokod 40 pikseli,
2.2
Praca z obrazami
2.2.1
gdzie parametrami tej funkcji s: rozmiary obrazu, podawane za pomoc zmiennej size
(szerokod i wysokod), gbia pikseli obrazu oraz wybr przestrzeni kolorw. Naley pamitad,
21
e w przypadku przestrzeni RGB, trjki wartoci piksela s podawane w kolejnoci (b0, g0, r0),
(b1, g1, r1) itd., a nie w kolejnoci na jak wskazywaa by nazwa RGB.
Podobnie jak w przypadku macierzy, operacj tworzenia obrazu moemy wykonad
dwuetapowo.
Najpierw
tworzymy
nagwek
obrazu
za
pomoc
funkcji
cvCreateImageHeader(), ktrej parametry s takie same jak cvCreateImage(). Nastpnie
alokujemy pamid za pomoc cvCreateData().
Gdy przestajemy uywad obrazu uywamy funkcji cvReleaseImage(), ktra usuwa
i zwalnia pamid po obrazie:
void cvReleaseImage(IplImage** img),
gdzie *img jest wskanikiem do wskanika i okrela obraz, ktry chcemy zwolnid. Jeeli nie
zaalokowalimy pamici na obraz a jedynie stworzylimy dla niego nagwek to moemy go
usund za pomoc funkcji cvReleaseImageHeader(), o parametrach takich jak powysza
funkcja cvReleaseImage().
W momencie kiedy na potrzeby programu potrzebujemy wiern kopie obrazu,
na ktrym pracujemy wykorzystujemy funkcj cvCloneImage(), ktra zwraca kopi obrazu:
IplImage* cvCloneImage(const IplImage* img),
2.2.2
22
Nazwa modelu przestrzeni RGB powsta od pierwszych liter angielskich nazw kolorw,
z ktrych ta przestrzeo jest stworzona (Red-Green-Blue). Kolory te nie s przypadkowe
i wynikaj z moliwoci odbiorczych oka ludzkiego. Wraenie widzenia konkretnego koloru
przez oko moe powstad z odpowiedniego poczenia trzech wizek wiata o wspomnianych
kolorach. Barwy pochodne powstaj przez zastosowanie syntezy addytywnej barw
podstawowych. Model RGB jest modelem teoretycznym. Jego odwzorowanie moe byd rne,
zakres barw przestrzeni jest zaleny od urzdzenia. Najczciej wykorzystuje si 24bitow
reprezentacj kolorw RGB, 8 bitw na kady z kolorw podstawowych (zakres od 0-255). Przy
wartoci 0 wszystkich kolorw skadowych modelu RGB piksel ma kolor czarny, za przy
wartoci 255 kolor biay [3].
Pochodnym modelem koloru od RGB jest model RGBA (inaczej ARGB), ktry zosta
wzbogacony o dodatkowy parametr alpha. Wartod alpha jest wspczynnikiem pochaniania
wiata, ktry odpowiada za przeroczystod piksela. Jeeli jego wartod jest rwna 0% to dany
piksel jest cakowicie przeroczysty i przyjmuje kolor ta, ktre znajduj si pod nim. Dla
wartoci kanau alpha rwnej 100%, piksel przyjmuje taki kolor jak w standardowym modelu
RGB.
Model HSV zosta stworzony z myl jak najlepszego odzwierciedlenia sposobu widzenia
ludzkiego oka. Model ten zakada, e wszystkie barwy pochodz od wiata biaego, gdzie czd
widma zostaje wchonita a czd odbita od owietlanych przedmiotw. Jego nazwa powstaa
od pierwszy liter angielskich nazw:
barwy wiata (ang. Hue), bdcej ktem na kole barw podstawy stoka, z
zakresem wartoci od 0 do 360 stopni,
mocy wiata biaego (ang. Value, znanej rwnie jako Brightness), bdcej
wysokoci stoka.
23
Pierwsze dwa argumenty to obraz rdowy i przekonwertowany. Istot tej funkcji jest trzeci
argument code determinujcy typ konwersji (instrukcja do biblioteki OpenCV zawiera opisy
wszystkich moliwych rodzajw konwersji). W przypadku zamiany RGB na skal szaroci
argument code powinien mied wartod CV_RGB2GREY, w przypadku odwrotnym CV_GREY2RGB.
Konwersja z przestrzeni RGB do HSV stanowi trudniejsze zadanie. Wartoci R, G oraz B
musz zostad przekonwertowane na typ zmiennoprzecinkowy na nastpnie przeskalowane do
przedziau od 0 do 1. Naley pamitad, e wartod Hue jest z zakresu od 0 do 360, Saturation
i Value od 0 do 1. Poniej zosta przedstawiony algorytm konwersji wartoci RGB do HSV:
(
(
24
)
(
{
W przypadku tej konwersji przy zastosowaniu funkcji cvCvtColor(), parametr code powinien
mied wartod CV_RGB2HSV.
Wszystkie pozostae dostpne typy konwersji przy zastosowaniu powyszej funkcji
s wymienione w podrczniku uytkownika OpenCV, dlatego nie zostan tutaj przetoczone.
2.3
2.3.1
Obsuga okien
jest jako tytu oraz flaga, okrelajca moliwoci zwizane ze zmian rozmiaru okna. Sama flaga
CV_WINDOW_AUTORESIZE jest ustawiona domylnie, dziki czemu okno dopasowuje si
automatycznie do rozmiaru obrazu wczytanego w tym oknie. Jeeli uytkownik ma mied
moliwod regulacji rozmiaru okna, to flaga musi byd ustawiona na 0. Pena specyfikacja
omawianej funkcji wyglda nastpujco:
int cvNamedWindow(const char* name,
int flags = CV_WINDOW_AUTOSIZE
);
Rozmiar okna moemy zmienid za pomoc funkcji cvResizeWindow(), ktra poza nazw
okna, potrzebuje parametry nowej szerokoci oraz wysokoci okna wyraonej w pikselach:
void cvResizeWindow (const char* name, int width, int height);
2.3.2
gdzie parametrami s: filename nazwa pliku zawierajcego obraz oraz iscolor, ktry okrela
kolor obrazu dla nastpujcych wartoci:
isocolor > 0 (lub flaga CV_LOAD_IMAGE_COLOR) obraz traktowany jest jak kolorowy
trzykanaowy,
isocolor = 0 (lub flaga CV_LOAD_GREYSCALE) obraz jest w odcieniach szaroci,
isocolor < 0 (lub flaga CV_LOAD_ANYCOLOR) obraz jest traktowany w zalenoci
gdzie filename jest nazw zapisywanego pliku (jego rozszerzenie wiadczy o formacie zapisu)
oraz wskanik *image wskazuje obraz do zapisu. W przypadku poprawnego zapisu pliku funkcja
zwrci liczb cakowit 1, w przypadku niepowodzenia 0.
W momencie gdy obraz jest ju zaadowany, mona go wywietlid uywajc funkcji
cvShowImage(), ktra przyjmuj nastpujce argumenty:
void cvShowImage(const char* name,const CvArr* image,
gdzie wskanik *name jest oknem, na ktrym ma zostad wywietlony obraz, ktry jest drugim
parametrem wskanikiem *image.
2.3.3
Pierwsza czd tego podrozdziau zostanie powicona obsudze plikw wideo, druga za
funkcjom, ktre pozwalaj na gromadzenie danych z kamery podczonej do komputera.
adowanie
Przy poprawnym zaadowaniu pliku funkcja zwraca wskanik do struktury CvCapture bdc
analogi do IplImage, ktra zawiera informacj potrzebne do odczytania klatek z plikw wideo
lub kamery. Przy bdnym wczytaniu zostanie zwrcony wskanik NULL. Bd moe wynikad
z braku pliku docelowego lub gdy plik wideo zosta skompresowany kodekiem, ktry nie jest
obsugiwany przez bibliotek.
Gdy plik zosta poprawnie zaadowany mona zaczd odczytywad z niego klatki. Mona
to zrobid na dwa sposoby.
Pierwszy z nich wykorzystuje funkcj cvGrabFrame(), ktra przyjmuje jako parametr
wskanik na struktur CvCapture i zwraca liczb cakowit 1 w przypadku powodzenia lub 0
w przypadku bdnego odczytania. Klatka zostaje zapisana do wewntrznego bufora pamici
biblioteki, do ktrej uytkownik nie ma dostpu, dziki temu caa operacja pobrania ramki jest
27
Drugi sposb jest zdecydowanie atwiejszy. Wymaga on uycia funkcji cvQueryFrame(), ktra
jest dwch powyej wymienionych funkcji i zwraca podobnie jak cvRetrieveFrame() wskanik
na IplImage.
IplImage* cvQueryFrame (CvCapture* capture);
W momencie kiedy zostaa zakooczona praca z plikiem wideo naley zwolnid przydzielon na
niego pamid za pomoc funkcji cvReleaseCapture(), ktrej parametrem jest wskanik do
wskanika CvCapture:
void cvReleaseCapture (CvCapture** capture);
Jedynym argumentem funkcji jest index, bdcy numerem kamery w systemie operacyjnym.
Parametr ten domylnie ustawiony jest na wartod 0, ktra oznacza,
e w systemie istnieje tylko jedna kamera. Wartod ta jest inkrementowana, gdy do komputera
podczona jest wicej ni jedna kamera. Funkcja ta zwraca wskanik do struktury CvCapture.
Klatki z sekwencji wideo nagrywanej przez kamer zapisywane s za pomoc funkcji
cvQueryFrame(), ktrej jedynym parametrem jest wskanik na struktur CvCapture. Funkcja
ta nie musi oddzielnie alokowad pamici na sekwencj wideo, gdy jest ona automatycznie
przydzielona pamici bdcej czci struktury CvCapture. Poniej zosta zamieszczony kod,
ktry obrazuje jak w poprawny sposb pobrad sekwencj wideo z kamery (w tym przypadku
jedynej w systemie) oraz jak j zapisad w pamici:
CvCapture* cap = cvCreateCameraCaputure( 0 );
frame = cvQueryFrame( cap );
28
int fourcc,
double fps,
CvSize frame_size,
int is_color = 1
);
Pierwszy parametr filename jest nazw obiektu. Drugi fourcc odpowiada za okrelenie kodeka
kompresji wideo, ktry zapisywany jest w unikalnej dla danego kodeka sekwencji
czterobitowej (c0,c1,c2,c3). Nastpny parametr fps okrela ilod klatek na sekund
w sekwencji wideo, frame_size dugod zapisywanej sekwencji, is_color za okrela czy
sekwencja jest czarno-biaa, czy kolorowa (domylnie parametr ustawiony jest na 1, czyli
sekwencj kolorow).
Nastpnie
naley
dokonad
procesu
zapisu
sekwencji
wykorzystujc
funkcj
cvWriteFrame():
int cvWriteFrame(
CvVideoWriter* writer,
const IplImage* image
);
Jej argumentami jest tylko writer obiekt struktury CvVideoWriter oraz zapisywany obraz. Po
dokonanym zapisie nie mona zapomnied o wywoaniu funkcji cvRealeaseVideoWriter()
w celu uwolnienia video writera oraz zamkniciu zapisywanego pliku wideo. Jeeli wywoanie
to zostanie pominite to na koocu programu moe dojd do przerwania zapisu i plik nie
zostanie poprawnie zapisany.
Na koniec warto wspomnied o przydatnych funkcjach cvSetCaptureProperties()
i cvGetCaptureProperties(), ktre pozwalaj na ustawienie i odczytanie wielu parametrw
sekwencji wideo. Ich deklaracje wygldaj nastpujco:
int cvSetCaptureProperty(CvCapture* cap, int property_id, double value),
int cvGetCaptureProperty(CvCapture* cap, int property_id, double value),
Parametr *cap jest sekwencj wideo, a parametr property_id przyjmuje nastpujce wartoci
(w nawiasach s podane ich numeryczne odpowiedniki):
przedziale od 0 do 1,
(7)
2.3.4
Obsuga myszy
Kolejn istotn czci HighGUI jest obsuga myszy i klawiatury, ktre pozwalaj
na interakcj pomidzy uytkownikiem a wywietlanym w oknie obrazem. Komunikacja
pomidzy urzdzeniami wskazujcymi, a OpenCV nie jest prostym zadaniem gdy oparta jest
na standardowym mechanizmie wywoania zwrotnego. W celu uatwienia czytelnoci,
mechanizm zostanie opisany dla myszy.
Do detekcji zdarzenia pochodzcego od urzdzenia naley najpierw napisad funkcj
wywoania zwrotnego, ktra pozwoli OpenCV na reakcj po zdarzeniu od myszy (np.
pojedyncze kliknicie). Nastpnie naley zarejestrowad wspomnian funkcj, dziki temu
OpenCV bdzie wiedziao, e powinna zostad wywoana przy okrelonym zdarzeniu ze strony
myszy, we wskazanym oknie. OpenCV nie zawiera konkretnej funkcji, ktra reaguje na
zdarzenia. Ta funkcja musi zostad napisana przez programist, w taki sposb eby zawieraa
odpowiedni zestaw parametrw i zwracaa odpowiedni typ. Funkcja musi posiadad informacj
o rodzaju zdarzenia oraz miejscu jego zajcia. Nastpnie funkcja musi rwnie wiedzied, czy
uytkownik w czasie zdarzenia wcisn przycisk Alt, Shift lub Ctrl. Poniej zosta przedstawiony
prototyp funkcji speniajcej wszystkie wymogi:
void CvMouseCall (
int event,
int x, int y,
int flags, void* param);
Przy zajciu zdarzenia OpenCV wypenione zostan argumenty funkcji. Pierwszy parametr
event przyjmie jedn z poniszych wartoci (ponownie, w nawiasach znajduj si odpowiedniki
numeryczne):
CV_EVENT_MOUSEMOVE (0)
CV_EVENT_LBUTTONDOWN (1)
CV_EVENT_RBUTTONDOWN (2)
CV_EVENT_MBUTTONDOWN (3)
CV_EVENT_LBUTTONUP (4)
CV_EVENT_RBUTTONUP (5)
CV_EVENT_MBUTTONUP (6)
CV_EVENT_LBUTTONDBLCLK (7)
CV_EVENT_RBUTTONDBLCLK (8)
CV_EVENT_MBUTTONDBLCLK (9)
CV_EVENT_FLAG_LBUTTON (1)
CV_EVENT_FLAG_RBUTTON (2)
30
CV_EVENT_FLAG_MBUTTON (4)
CV_EVENT_FLAG_CTRLKEY (8)
CV_EVENT_FLAG_SHIFTKEY (16)
CV_EVENT_FLAG_ALTKEY (32)
gdzie parametr window_name wskazuj nazw okna, dla ktrego funkcja jest rejestrowana,
on_mouse jest funkcj rejestrowan, a param jest wspomnianym parametrem przekazywanym
do funkcji, ktra jest rejestrowana.
W celu uatwienia zrozumienia zagadnienia obsugi myszy poniej zosta przedstawiony
program, ktry ma pokazad proste zastosowanie obsugi myszy.
Po wczeniu programu uytkownik moe na czarnym obrazie rysowad elementy graficzne.
Po klikniciu lewego klawisza myszy i jego przytrzymaniu rysowane s niebieskie prostokty,
przytrzymany, prawy przycisk myszy pozwala na rysowanie czerwonej linii, przyciniecie
lewego przycisku myszki wraz z klawiszem SHIFT pozwala na rysowanie maych k.
31
Stworzona zostaa ptla nieskooczona (argument ptli while jest zawsze prawdziwy). W jej
wntrzu warunkiem instrukcji if jest funkcja cvWaitKey(10) liczba w nawiasie oznacza czas
w milisekundach jaki funkcja ma oczekiwad na nacinicie klawisza. Jeeli uytkownik wcinie
klawisz q nastpi wyjcie z ptli, ktre zazwyczaj kooczy si zwolnieniem zasobw pamici
zaalokowanych na potrzeby programu, a nastpnie jego zakooczeniem.
2.3.5
Niestety biblioteka HighGUI dostarcza tylko jeden element GUI, ktrym jest suwak. Brakuje
natomiast podstawowego, wydawaoby si elementu jakim jest przycisk, czy przecznik.
Funkcj odpowiedzialn za tworzenie suwaka jest cvCreateTrackBar(). Podobnie jak
nowemu oknu, suwakowi przydzielana jest unikalna nazwa, przez ktr w programie jest
identyfikowany. Definicja cvCreateTrackBar() wyglda nastpujco:
int cvCreateTrackbar(
const char* trackbar_name,
const char* window_name,
int* value,
int count,
CvTrackbarCallback on_change);
32
Poniej umieszczony zosta przykad zastosowania tych funkcji w programie, ktry zawiera
cztery suwaki. Trzy z nich odpowiedzialne s za ustawiania parametrw zwizanych
z przestrzeni kolorw RGB obrazu. Ostatni z nich resetuje zmiany do postaci (0,0,0). Dziaa
na zasadzie przecznika (ON/OFF). Program kooczony jest po wciniciu klawisza q. Kod
programu umieszczony zosta w zaczniku nr 2.
Jak widad w HighGUI mona poradzid sobie bez natywnego przecznika. Wystarczy ustawid
wartod count suwaka na 1.
Problem z brakiem standardowego przycisku mona rozwizad podobnie, jedyna rnica
polega na takim skonstruowaniu funkcji obsugi zdarzeo, eby pozycja suwaka po zmianie z 0
na 1 automatycznie wrcia na pozycj 0.
2.4
2.4.1
Do pikseli wszystkich typw obrazw mona uzyskad dostp dwiema metodami. Pierwsza z
nich to metoda porednia, ktra wykorzystuje do tego celu funkcje z grupy cvGet2D() oraz
cvSet2D().
33
gdzie dodatkowym parametrem jest val, bdcy wartoci wpisywan do piksela obrazu.
W przypadku obrazw kolorowych oraz wielokanaowych stosowane s analogiczne
funkcje cvSet2D() i cvGet2D(). Ich definicje s niemal identyczne jak w przypadku obrazw
czarno-biaych, z t rnic, e operujemy na danych CvScalar, a nie double. Warto pamitad,
e wygodnym sposobem na zapisywanie wartoci piksela z przestrzeni RGB jest wykorzystanie
makra CV_RGB np.:
CvScalar pix_value = CV_RBG (r,g,b);,
2.4.2
Wydziela ona interesujcy obraz za pomoc prostokta rect, i wypenia obraz submat
pikselami wyznaczonego obrazu. Oryginalny obraz jest wyznaczany za pomoc parametru arr.
34
2.4.3
35
2.4.4
Operacje macierzowe
36
2.4.5
Rysowanie ksztatw
cvLine(
IplImage*
img,
CvPoint
pt1,
CvPoint
pt2,
int
color,
int
gdzie img jest obrazem na ktrym bdzie rysowana linia, pt1 oraz pt2 wyznacza pocztek
i koniec linii, color okrela jej kolor, parametr thickness wyznacza grubod linii (w pikselach).
Ostatni z parametrw connectivity okrela sposb rysowania linii. Wartod domylna 8,
pozwala na rysowanie idealnie prostej linii, wartod 4 linii lekko chropowatej i zaamanej,
ale za to rysowanej duo szybciej.
Funkcja umoliwiajca narysowanie prostokta to cvRectangle():
void cvRectangle( IplImage* img, CvPoint pt1, CvPoint pt2, int color, int
thickness );
gdzie wszystkie parametry s takie same jak w cvLine(). Dodatkowo parametr thickness
przyjmujc wartod -1 (lub flag CV_FILLED) wypenia figur kolorem okrelonym parametrem
color.
CvCircle() jest funkcj odpowiedzialn za rysowanie okrgw. Jej deklaracja wyglda
nastpujco:
void cvCircle( IplImage* img, CvPoint center, int radius, int color, int
thickness=1 );
37
void cvEllipse( IplImage* img, CvPoint center, CvSize axes, double angle,
double startAngle, double endAngle, int color, int thickness=1 );
gdzie center jest rodkiem elipsy, axes wymiary osi elipsy, angle jest ktem rotacji elipsy,
startAngle jest pocztkowym ktem rysowania krzywej elipsy, endAngle ktem koocowym,
ostatnie parametry tak samo jak w przypadku pozostaych funkcji rysujcych. W celu lepszego
zrozumienia parametrw elipsy zamieszczony zosta poniej rysunek:
Pierwsza z nich ma moliwod rysowania wielu wielobokw razem, ale jest stosunkowo
wolna. CvFillConvexPoly() dziaa na tej samej zasadzie co cvFillPoly() ale moe rysowad
tylko jeden wielobok w tym samym czasie. Dodatkowo musi to byd wielobok wypuky. Sporym
atutem tej funkcji jest szybkod dziaania. Ostatnia funkcja ma dokadnie takie same moliwoci
jak cvFillPoly() jednak przez to, e dziaa w inny sposb jest od niej zdecydowanie szybsza.
38
2.4.6
Wstawianie tekstu
gdzie font jest wskanikiem do struktury czcionki, font_face jest rodzajem czcionki, hscale
wysokoci czcionki, vscale szerokoci, shear ktem pochylenia czcionki, pozostae
parametry opisane zostay w podrozdziale 2.4.5.
Po inicjalizacji czcionka dodaje si funkcj cvPutText():
cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font,
CvScalar color);
gdzie img jest obrazem, na ktry ma byd nakadany tekst, text cigiem wpisywanego tekstu,
org wsprzdnymi lewego dolnego rogu tekstu, font czcionk ktra zostaa wczeniej
zainicjowana, color za jej kolorem.
39
3. Przetwarzanie obrazw
3.1
Progowanie
gdzie parametr threshold jest wartoci progu, maxValue maksymalna wartoci przypisywan
do piksela, thresholdType jednym z wyliczonych wyej sposobw progowania.
Dla progowania binarnego dla wartoci piksela wikszej od wyznaczonego progu funkcja
przypisuje 0, w przeciwnym wypadku wartod maxValue:
(
40
(
(
(
(
Progowanie adaptacyjne moe byd wykonywane na dwa sposoby okrelane przez parametr
threshold_type. W obu przypadkach badane piksele klasyfikowane s na podstawie swojej
wartoci oraz zmiennego progu obliczonego na podstawie analizy pikseli otoczenia badanego
punktu. Otoczenie to jest wyznaczane przez kwadratowy obszar o boku wartoci block_size.
Z ssiedztwa badanego piksela obliczana jest rednia waona wartod, od ktrej odejmowana
jest staa wartod param1.
Pierwszy sposb obliczania progu to CV_ADAPTIVE_THRESH_MEAN_C, w ktrym kady piksel
jednakowo wpywa na obliczenie wartoci redniej waonej. W drugim wypadku dla
CV_ADAPTIVE_THRESH_GAUSSIAN_C
waga pikseli obliczana jest z wykorzystaniem
dwuwymiarowego rozkadu Gaussa na podstawie ich odlegoci od badanego piksela.
42
3.2
punkt
centralny
Wartod konwolucji badanego piksela jest obliczana w nastpujcy sposb. Najpierw punkt
centralny maski umieszczany jest na analizowanym pikselu rdowego obrazu, a pozostae
punkty maski nakadane s na piksele ssiednie. Wartod badanego piksela obliczana jest
poprzez sumowanie iloczynw wspczynnikw maski z wartociami odpowiadajcych im
pikseli na obrazie. Operacja ta jest powtarzana dla kadego piksela obrazu rdowego. Proces
moe zostad opisany nastpujcym rwnaniem matematycznym:
)(
gdzie parametr kernel jest wskanikiem do macierzy maski, ktr tworzy programista,
wypeniajc j wartociami wspczynnikw. W standardzie OpenCV 2.1 wartoci te musz byd
liczbami zmiennoprzecinkowymi 32bitowymi (CV_32FC1).
43
3.3
44
po wsprzdnej x :
po wsprzdnej y :
):
-1
-1
-1
-1
S one jednak bardzo podatne na szumy i naley je stosowad jedynie na obrazach o dobrej
jakoci lub na obrazach po filtracji usuwajcej szumy wysokoczstotliwociowe (np. filtrem
Gaussa, medianowym).
45
3.3.1
Filtr Sobela
Bardziej odporny na zakcenia jest operator Sobela. Funkcj realizujc filtr Sobela jest
cvSobel():
void cvSobel(const CvArr* src,CvArr* dst,
int xorder,
int yorder,
int apertureSize=3 );
Pozwala ona na obliczanie pierwszej, drugiej i trzeciej pochodnej obrazie przez jego splot
(
z maskami:
-2
-1
-1
-2
-1
-3
10
-10
10
-3
-3
-10
-3
46
a)
b)
c)
d)
e)
f)
Rysunek 18 Zastosowanie rnych operatorw kierunkowych Sobela dla obrazu w skali szaroci
. Stosuje
M2
M3
M4
M5
M6
M7
M8
M9
|(
)|
|(
)|
3.3.2
Filtr Laplacea
Filtr Laplacea umoliwia wykrywanie wszystkich krawdzi. Jego dziaanie oparte jest na
obliczeniu laplasjanu, ktry jest sum drugich pochodnych czstkowych w prostopadych
kierunkach x i y. W OpenCV suy do tego funkcja cvLaplace(), ktrej parametry s takie same
jak w przypadku funkcji cvSobel():
void cvLaplace(const CvArr* src,CvArr* dst, int apertureSize=3);
48
Realizacja algorytmu tej funkcji odbywa si przy wykorzystaniu operatora Sobela dla drugiej
pochodnej. Dla parametru aparture_size=1 laplasjan obrazu wyjciowego jest splotem obrazu
wejciowego z ponisz mask:
0
-4
Krawdzie wykrywane s w miejscach gdzie druga pochodna funkcji zmiany jasnoci pikseli
na obrazie jest rwna zero (miejsce zerowe). Oznacza, to e krawdzie obiektw na obrazie
znajduj si w miejscu gdzie laplasjan badanego obszaru rwna si 0.
Jak mona zauwayd na rysunkach filtr Laplacea wykrywa krawdzie w kadej paszczynie. S
one wyraziste i uwypuklone.
3.3.3
Filtr Cannygo
Ustala si dwa progi: dolnym i grny, ktre umoliwiaj ostateczny wybr pikseli linii krawdzi.
Jeeli wartod gradientu piksela kandydata jest wiksza ni grny prg to staje si on czci
krawdzi, jeeli jego wartod jest mniejsza od progu dolnego to zostaje on odrzucony.
W momencie gdy piksel znajduje si w przedziale pomidzy progiem dolnym i grnym to
zostaje on zaakceptowany tylko w przypadku, gdy jest poczony z cigiem pikseli o wartoci
powyej progu histerezy.
W OpenCV algorytm ten realizowany jest przez funkcj cvCanny():
void Canny( const Mat& image, Mat& edges,
double threshold1, double threshold2,
int apertureSize=3, bool L2gradient=false );
gdzie image jest obrazem rdowym, edges obraz zwracany z wykrytymi krawdziami,
threshold1 jest dolnym progiem, threshold2 grnym, apartureSize jest rozmiarem maski
Sobela. Ostatni parametr L2gradient okrela sposb obliczania gradientu kierunkowego
opartego o operatory Sobela. Jeeli parametr ten ma wartod true gradient kierunkowy
obliczany jest z przyblionego wzoru | | | | | |, gdy false ze wzoru dokadnego
| |
Funkcja cvCanny() wymaga, aby obraz wejciowy by w skali szaroci oraz eby by
8-bitowy. Wynikowy obraz binarny jest rwnie 8 bitowy.
50
3.4
Kontury
3.4.1
Kontur jest list punktw, ktre mog reprezentowad na wiele sposobw krzyw
na obrazie. W OpenCV kontury reprezentowane s za pomoc sekwencji CvSeq (omawianych
w rozdziale 2.1.2), gdzie kada pozycja w sekwencji zawiera informacj o lokalizacji nastpnego
punktu krzywej. Funkcj odpowiedzialn za obliczanie konturw z obrazu binarnego jest
cvFindContours(). Z praktycznego punktu widzenia obraz wejciowy, na ktrym maj zostad
wykryte kontury najpierw poddawany jest przetwarzaniu funkcj cvCanny() w celu uzyskania
obrazu binarnego z krawdziami lub funkcj cvThreshold() (bd cvAdaptiveThreshold()),
ktra tworzy obraz binarny na podstawie progowania okrelona jasnoci pikseli.
Poniej przedstawiony rysunek pozwoli na atwiejsze zrozumienie definicji kontury
i sposobu dziaania funkcji cvFindContours().
Obraz po lewej stronie zawiera biae figury na szarym tle (obraz przed przetwarzaniem
funkcj cvFindContours() zostanie poddany binaryzacji). Kada z tych figur jest oznaczona
liter od A do E. Obraz po prawej stronie zosta poddany dziaaniu funkcji do wykrywania
konturw. Kolorem czerwonym zaznaczone zostay zewntrzne granice, za zielonym
wewntrzne granice biaych figur. Kontury te rwnie zostay oznaczone literami: zielone hX
(od ang. hole), czerwone cX (od angl. contour), a X stanowi pewn liczb. Ten sposb
relacji zawierania pozwala na ustalenie wzajemnych powizao pomidzy konturami
w tzw. drzewo konturw (ang. contours tree). W powyszym przypadku drzewo konturw
rozpoczynaoby si od korzenia c0 oraz dziur h00 i h01 bdcymi gwnymi odgazieniami,
itd.
Definicja funkcji cvFindContours() wyglda nastpujco:
int cvFindContours(
IplImage* img,
CvMemStorage* storage,
CvSeq** firstContour,
int headerSize = sizeof(CvContour),
CvContourRetrievalMode mode = CV_RETR_LIST,
CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE
);
51
Pierwszy argument img jest obrazem wejciowym, ktry powinien byd 8-bitowym,
jednokanaowym obrazem binarnym. Drugi argument storage wskazuje miejsce, w ktrym
zostaa przydzielona pamid na zapis sekwencji konturw. Pamid ta powinna byd wczeniej
przydzielona za pomoc cvCreateMemStorage(). Kolejny argument firstContour
jest wskanikiem na sekwencj CvSeq*, a dokadnie na pocztek drzewa konturw. Funkcja
sama alokuje wskanik, dlatego jego wartod na pocztku powinna byd ustawiona na NULL. Po
wywoaniu funkcja zwraca sum wszystkich znalezionych konturw.
Parametr headerSize wskazuje na rozmiar alokowanych obiektw (konturw). Nastpny
argument mode przyjmuje jedn z czterech wartoci: CV_RETR_EXTERNAL, CV_RETR_LIST,
CV_RETR_CCOMP lub CV_RETR_TREE. Okrela on sposb w jaki funkcja ma zwracad znalezione
kontury. Poruszanie midzy znalezionymi konturami odbywa si z wykorzystaniem cznikw
h_prev, h_next, v_prev, v_next. Dla powyej omawianego przykadu zostan rozwaone
wymienione przypadki:
firstContour = c0,
52
3.4.2
Operacje na konturach
53
3.4.3
Pierwsza funkcja odczytuje aocuchy konturw. Pierwszym jej argumentem jest pierwszy
odczytywany aocuch chain8 oraz reader9 bdcy wskanikiem do aktualnie przetwarzanego
elementu. Reader przechodzi pomidzy pojedynczymi konturami reprezentowanymi przez
aocuchy. Jeeli zwraca wartod NULL oznacza to, e wszystkie aocuchy zostay odczytane.
Druga funkcja ma za zadanie odczytad pooenie aktualnie odczytywanego elementu aocucha.
Zasad kodowania aocuchowego Freemana przedstawia poniszy rysunek:
8
9
54
pocztek
aocucha
0
Rysunek 23 Kod aocuchowy Freemana
3.4.4
Rysowanie konturw.
Pierwszy argument img jest obrazem, na ktrym kontury bd rysowane. Nastpny argument
contour wskazuje na pocztek drzewa konturw (ang. root node). Skalary external_color
oraz hole_color okrelaj kolor konturu zewntrznego oraz wewntrznego. Parametr
max_level jest bardzo istotny z punktu widzenia rysowania konturw i ich opisu. Okrela, ktre
kontury maj byd rysowane tzn. jak gboko zagniedone wzgldem najbardziej zewntrznego
konturu. Jeeli max_level = 0 wwczas rysowany jest tylko kontur wskazany przez wskanik
contour. Dla max_level = 1 rysowane s wszystkie kontury bdce na tym samym poziomie
co kontur wejciowy. Dla wartoci 2 wszystkie kontury na pierwszym poziomie zagniedenia w
namalowanych konturach (przy max_level = 1), itd. W celu narysowania konturw
zagniedonych tylko w wejciowym konturze uywa si ujemnych wartoci parametru
max_level. Dla wartoci -1 rysowane s kontury z pierwszego poziomu zagniedenia
wejciowego konturu, dla 2 drugiego, itd. Parametry thickness oraz line_type okrelaj
sposb rysowania linii konturu. Ostatni parametr offset okrela przesunicie rysowanych
konturw wzgldem ich rzeczywistego pooenia. Ponisze rysunki pokazuj idee regulowania
parametru max_level.
55
Rysunek 25 Obraz wejciowy po wykryciu konturw. Dla parametru max_level = -3, -2, -1, 0, 1, 2, 3 poczwszy od
10
obrazu w lewym grnym rogu .
3.5
Rozmycie
param4=0);
gdzie src jest obrazem rdowym, dst obrazem przetworzonym, smoothtype rodzajem
filtru, argument param1 i param2 s rozmiarami maski, parametry param3 i param4 s rnie
wykorzystywane w zalenoci od rodzaju rozmycia.
10
56
Poniej zostan opisane najbardziej znane i najczciej uywane filtry czyli: medianowy,
gaussowski i bilateralny.
Filtr medianowy (CV_MEDIAN) wykorzystywany jest do usuwania losowych zakceo, ktrych
poziom intensywnoci piksela znacznie odbiega od intensywnoci pikseli ssiednich. Filtr
przetwarza dany piksel obrazu na median odpowiadajc dystrybuanty jasnoci pikseli
z caego rozwaanego otoczenia (tj. maski) przetwarzanego piksela [4]. Biorc pod uwag, e
dane obrazu maj postad dyskretn oraz, e suma elementw maski jest liczb nieparzyst,
mediana wyznaczana jest jako wartod rodkowa wektora pikseli maski, uoonych rosnco lub
malejco, ze wzgldu na jasnod piksela. Filtr skutecznie usuwa zakcenia typu salt and
peeper nie powodujc rozmazania obrazu. Operacje za pomoc tego filtru mog byd
wykonywane na obrazach jedno-, trzy- lub czterokanaowych 8-bitowych.
Filtr Gaussa (CV_GAUSSIAN) wykorzystywany jest do rozmycia obrazu, usunicia detali oraz
pozbycia si zakceo. Dziaaniem przypomina filtr uredniajcy jednak rni si od niego
rodzajem maski, ktra ma odwzorowywad ksztat funkcji rozkadu Gaussowskiego. Funkcja
rozkadu Gaussowskiego dwuwymiarowego ma postad [7]:
(
, lub
Nastpnie filtr Gaussa jest realizowany poprzez splot kadego punktu obrazu rdowego
z mask i sumowany w celu utworzenia obrazu docelowego. Wartod przetwarzanego piksela
jest uzaleniona od odlegoci Euklidesowej pomidzy nim a innymi elementami maski.
Ponisze rysunek najlepiej odzwierciedla jego dziaanie:
57
58
b)
3.6
Transformata Hougha
3.6.1
Wykrywanie linii
L2
L1
L3
L4
P0
Na powyszym obrazie przez punkt P0 o wsprzdnych (xo, yo) przechodzi prosta L1.
Prost t mona opisad rwnaniem kierunkowym:
. Prost t mona zapisad
w postaci parametrycznej:
, gdzie r jest odlegoci prostej od pocztku
ukadu wsprzdnych (wzdu normalnej), za jest ktem pomidzy normaln do prostej
a osi wsprzdnych OX [9].
Powizanie parametrw obu rwnao wyglda nastpujco:
, oraz
Nastpnie prosta L1 obracana jest wok punktu P0, powstajce proste L1, L2, L3, L4 tworz
w przestrzeni zbir punktw, ktry ukada si na krzywej sinusoidalnej. Jeeli na obrazie w
przestrzeni (x, y) istnieje wicej punktw to w przestrzeni Hougha powstaje zbir zwizanych
z nimi krzywych. Punkty lece na tej samej prostej w przestrzeni (x, y) tworz sied krzywych
przecinajcych si w jednym punkcie w przestrzeni Hougha. Punkt ten jest lokalnym
maksimum odpowiadajcym prostej w przestrzeni (x, y).
59
Rysunek 30 Realizacja transformaty Hougha dla linii prostych. Obrazy przestrzeni (x, y) oraz przestrzeni
11
parametrycznej (theta, r)
Zgodnie z tym co pokazuj powysze rysunki kad prost w przestrzeni (x, y) mona
odwzorowad w punkt o wsprzdnych ( , r) w przestrzeni Hougha.
Progresywna Probabilistyczna transformata Hougha (ang. progressive probabilistic Hough
transform PPHT), jest modyfikacj klasycznej metody. Rnica polega miedzy innymi na tym,
e obliczane s dodatkowo zakresy linii, a nie tylko jej orientacja. Metoda ta ma w nazwie
probabilistyczna, poniewa nie bada wszystkich punktw z przestrzeni (x, y), ktre skadaj si
na lokalne maksimum w przestrzeni Hougha. Wystarczajco due skupisko przecinajcych si
krzywych w przestrzeni Hougha interpretowane jest jako istnienie linii w przestrzeni (x, y).
Takie zaoenie pozwala na zmniejszenie iloci obliczeo potrzebnych do detekcji linii
na obrazie.
Skalowalna transformata Hougha (ang. multi-scale Hough transform MSHT) daje
moliwod zmiany dokadnoci wykrywania linii za pomoc zmiany rozmiarw akumulatora
(parametrw rho i theta).
Wszystkie te algorytmy s dostpne za pomoc jednej funkcji cvHoughLines2() i uywane
w zalenoci od wartoci jej parametrw:
11
60
Pierwszy argument jest obrazem wejciowym. Musi byd to obraz 8-bitowy, ktry jest
traktowany jako binarny (kady niezerowy piksel jest traktowany tak samo) [8]. Drugi
argument jest wskanikiem do miejsca, w ktrym wykryte linie bd przechowywane.
Alokowane mog byd za pomoc opisywanej wczeniej struktury CvMemoryStorage lub jako
tablica Nx1, gdzie N oznacza ilod znalezionych linii. Kolejny parametr metody moe
przyjmowad nastpujce wartoci w zalenoci od rodzaju uywanego algorytmu:
transformaty (skalowaln).
Kolejne dwa argumenty: r i theta okrelaj rozdzielczod (dokadnod) z jak maj byd
wyznaczane linie na obrazie. Dokadnod t mona rozumied jako rozmiar dwuwymiarowej
macierzy zwanej akumulatorem. W jej komrki o rozmiarach theta x r wpisywane zostaj
punkty, ktre s interpretacj linii na obrazie z przestrzeni (theta).
Parametr threshold jest progiem, ktry musi osignd komrka akumulatora eby zostaa
zaklasyfikowana jako linia na obrazie. Naley pamitad o skalowaniu tej wartoci w zalenoci
od parametrw akumulatora. Argumenty param1 i param2 nie s uywane w przypadku SHT.
Dla PPHT param1 okrela minimaln dugod segmentu linii, ktra ma zostad znaleziona. Param2
okrela natomiast minimaln odlegod pomidzy poziomymi segmentami linii, przy ktrej nie
s czone na obrazie przetworzonym. W przypadku algorytmu Multi-scale HT param1 i param2
s dodatkowymi wartociami skalujcymi rozdzielczod akumulatora zgodnie ze wzorami:
oraz
61
3.6.2
Wykrywanie okrgw
gdzie (xo, yo) jest punktem nalecym do okrgu. Wwczas punkt w przestrzeni (x, y)
bdzie reprezentowany jako okrg w przestrzeni (a, b).
y
y
X
62
Binarny obraz rdowy poddawany jest filtracji Sobela (cvSobel()) w celu detekcji
krawdzi okrgw. Nastpnie tworzone s okrgi o takim samym promieniu i rodku w kadym
pikselu nalecym do krawdzi. W efekcie powsta trzeci rysunek, na ktrym widad dokadnie
lokalne maksima bdce rodkami okrgw z obrazu binarnego. W obu przypadkach:
gdy okrgi byy rozczne oraz gdy nachodziy na siebie, algorytm dosonale sobie poradzi
z wyznaczeniem ich rodkw.
W momencie gdy promieo poszukiwanego okrgu naley do pewnego przedziau algorytm
postpowania jest podobny. Rnica polega jedynie na tym, e dla kadego piksela wykrytej
krawdzi tworzone s okrgi o promieniach z zadanego przedziau, przy zadanej rozdzielczoci.
Wyej przedstawiony algorytm jest skuteczny dla bardzo wyranych i prostych w detekcji
okrgw na obrazach. W przypadku gdy okrgi nie s idealne, zaszumienie na obrazie znacznie
wiksze, algorytm ten nie jest w stanie poradzid sobie z poprawn detekcj rodkw okrgw.
W OpenCV zaimplementowany jest bardziej rozbudowany algorytm, ktry jest
zdecydowanie bardziej odporny na zakcenia. Na pocztku obraz filtrowany jest za pomoc
cvCanny() w celu detekcji krawdzi. Nastpnie dla kadego niezerowego piksela obrazu liczone
s lokalne gradienty za pomoc funkcji cvSobel(). Korzystajc z kierunkw tych gradientw do
akumulatora zapisywane s piksele lece w tym kierunku pomidzy minimaln a maksymaln
odlegoci od piksela, w ktrym ten gradient by liczony. Nastpnie w akumulorze za pomoc
progowania usuwane s piksele, ktre znajduj si poniej okrelonej wartoci. Pozostae
piksele sortowane s malejco. Te, ktre znajduj si na pocztku tej listy s najlepsztymi
kandydatami do uzania za rodek poszukiwanego okrgu. Na koniec tworzone s okrgi
o rodkach w pikselach kandydatach i promieniach z zadanego przez funkcj przedziau. Po tej
operacji na rodek okrgu wybierany jest piksel, z ktrego zosta wyprowadzony okrg
o krawdziach obejmujcych najwiksz liczb pikseli nalecych do krawdzi obrazu
po przefiltrowaniu funkcj cvCanny().
Powyszy algorytm realizuje funkcja cvHoughCircles():
63
Parametry tej funkcji s podobne jak w przypadku funkcji cvHoughLines2(). Wejciowy obraz
image musi byd 8-bitowy lecz w tym przypadku nie musi byd binarny, gdy wewntrz funkcji
cvHoughCircles() realizowana jest funkcja cvSobel(), ktra moe przyjd jako argument
obraz w skali szaroci. Drugi parametr circle_storage, to tak jak wczeniej line_storage jest
wskanikiem do miejsca, w ktrym przechowywane bd przechwytywne okrgi. Ponownie
alokowane mog byd w strukturze CvMemoryStorage lub w macierzy. Argument method zawsze
rwny jest CV_HOUGH_GRADIENT, czyli odpowiada metodzie, ktra zostaa opisana powyej.
Parametr dp jest rozdzielczoci akumulatora obrazu z przestrzeni Hougha. Wartod 1 tego
parametru okrela rozdzielczod akumulatora jako tak sam co obraz, wartoci powyej jeden
zmiejszaj t rozdzielczod w stosunku do obrazu. Parametr min_dist jest minimaln
odlegoci pomidzy rodkami wyktytych okrgw, eby nie byy one interetowane jako jeden
okrg. Parametry param1 i param2 s dolnym i grnym progiem parametru threshold z funkcji
cvCanny(). Ostatnie dwa parametry min_radius i max_radius okrelaj minimalny i
maksymalny promieo poszukiwanych okrgw. Poniej zamieszczony jest przykad dziaania tej
funkcji na obrazie rzeczywistym:
64
3.7
Przeksztacenia morfologiczne
67
Obie te funkcje posiadaj takie same parametry. Src jest obrazem rdowym, za dst
obrazem przetworzonym. Argument iterations odpowiada za ilod procesw
przeprowadzanego algorytmu, ostatni z parametrw B, bdcy obiektem IplConvKernel*
jest elementem strukturalnym (dokadnie zostanie opisany w koocowej czci rozdziau).
Wartod domylna NULL oznacza, e obiekt strukturalny ma wymiary 3x3 z punktem
centralnym na pozycji (2, 2).
Biblioteka daje moliwod wykorzystywania zoonych operacji morfologicznych takich jak:
otwarcie CV_MOP_OPEN,
zamknicie CV_MOP_CLOSE,
gradient morfologiczny CV_MOP_GRADIENT,
detekcja maksimum lokalnego CV_MOP_TOPHAT,
detekcja minimum lokalnego CV_MOP_BLACKHAT.
Parametry src, dst, element oraz iteration zostay opisane wczeniej. Nowym elementem
jest parametr temp, jest obrazem wykorzystywanym przy operacjach gradientu
morfologicznego oraz detekcji ekstremw, w ktrych konieczne jest uycie obrazu poredniego
(musi mied identyczne parametry jak obraz src i dst). Najwaniejszy parametr operation
okrela rodzaj przeprowadzanej operacji (wartoci tego parametru zostay opisane podczas
wyliczenia). Erozja i dylatacja s operacjami typu In-place tzn. przetwarzany obraz jest obrazem
rdowym.
Pierwsza operacja otwarcie jest zoeniem erozji z dylatacj. Za pomoc tego rodzaju
filtracji due obiekty na obrazie nie zmieniaj swoich wymiarw oraz ksztatw. Usuwane s
drobne obiekty, oraz rozsuwane obiekty z cienkimi poczeniami. Czsto stosowana jest w celu
wyodrbnienia elementw obrazu i ich policzenia na przykad liczenie komrek na obrazie
z pod mikroskopu.
Zamknicie jest operacj odwrotn do otwarcia. Najpierw wykonywana jest dylatacja
a nastpnie erozja. W tym przypadku due obiekty o wygadzonych brzegach nie zmieniaj
swojego ksztatu. Natomiast wypeniane s wszelkiego rodzaju dziury, wskie szczeliny oraz
wcicia. Mona powiedzied, e obiekty s wypenianie oraz czone ze sob.
Poniej przedstawione zostay efekty filtracji otwarciem i zamkniciem obrazu
wejciowego:
68
a)
b)
Nastpn operacj jest gradient morfologiczny. Zasad dziaania tej filtracji najlepiej
przedstawia wzr [10]:
(
Operacja ta odbywa si tylko na Jak widad gradientem nazywamy rnic dwch obrazw:
pierwszego poddanego dylatacji i drugiego po erozji. Gwnie wykorzystywana jest do detekcji
krawdzi [11]. Operacja pozwala na analiz szybkoci zmian jasnoci pikseli (std nazwa
gradient morfologiczny). Wyznacza granic pomidzy obszarami o wyszej jasnoci.
69
(
(
Morfologia TopHat izoluje lokalne obszary o duej jasnoci pikseli. Najpierw wynik otwarcia
jest odejmowany od obrazu rdowego, a nastpnie przeprowadza si binaryzacj z dolnym
progiem otrzymanej rnicy. Morfologia BlackHat wykrywa lokalne obszary o niskiej jasnoci.
Realizowane jest to poprzez odejmowanie obrazu rdowego od wyniku zamknicia.
a)
b)
3.8
Histogramy
Histogram obrazu jest charakterystyk jego rozkadu jasnoci, kolorw lub innych cech
obrazu. Zawiera przedziay (kosze ang. bins), ktrych wartod najczciej wskazuje na ilod
wystpowania pikseli o jasnoci okrelonej dla kadego przedziau. Jednak charakterystyka i to
co pokazuje histogram jest zalene tylko od uytkownika. Histogramy mog pokazywad rozkad
kolorw, jasnoci, umiejscowienia pikseli. Poniej pokazany jest przykad histogramu, ktry
bada ilod wystpowania pikseli na obrazie w zadanym przedziale zdefiniowanym przez
histogram.
70
Pierwszy argument dims okrela wymiar histogramu (1D, 2D, 3D). Parametr sizes wskazuje
na tablic o takie samej iloci liczb cakowitych co wymiar histogramu, ktre deklaruj ilod
koszy (przedziaw) dla kadego wymiaru histogramu. Nastpnie argument type wskazuje
na rodzaj zastosowanego histogramu CV_HIST_SPARSE lub CV_HIST_ARRAY (najczciej
uywany). Kolejny parametr ranges jest wskanikiem do tablicy dwuwymiarowej, ktrej
aktualne wartoci zale od nastpnego parametru uniform:
jeeli uniform = 1, wwczas w tablicy musz znaled si dwie liczby na jeden wymiar,
bdce zakresem obsugiwanych wartoci histogramu. Czyli np. jeli dla obrazu w skali
szaroci poziomy jasnoci s z zakresu 0 do 100 te dwie liczby wpisywane s
do macierzy. W przypadku gdy zadeklarowana ilod koszy wynosi 10 to kolejno bd
zawieray piksele o jasnoci z przedziaw [0,10), [10,20), itd.,
jeeli uniform = 0, wwczas w tablicy musi znaled si N+1 liczb na jeden wymiar,
stanowicych granice zakresw wartoci koszykw. Dla podobnego przypadku,
71
przy 4 koszykach (N=4), zakresy ksztatowayby si kolejno [Z1, Z2), [Z2, Z3), [Z3, Z4),
[Z4, Z5].
Po utworzeniu mona obliczyd histogram z obrazu lub obrazw rdowych za pomoc
funkcji cvCalcHist():
void cvCalcHist(IplImage** image, CvHistogram* hist,
int accumulate = 0,const CvArr* mask = NULL );
Parametr image jest obrazem lub obrazami rdowymi, hist stworzony wczeniej pustym
histogramem. Argument accumulate rwny 0, powoduje wyzerowanie histogramu przed
rozpoczciem obliczania. Ostatni parametr mask pozwala na pominicie czci obrazu: z obrazu
wejciowego brane s pod uwag tylko te piksele, ktre trafiaj na niezerowe elementy maski.
Naley pamitad, e funkcja ta wymaga, aby obraz by w skali szaroci lub binarny. Obrazy
wielokanaowe naley rozdzielid funkcj cvSplit() i liczyd histogramy dla kadego z kanaw.
W momencie gdy histogram nie jest ju uywany naley go usund, aby zwolnid zasoby
zajmowanej pamici. Odbywa si to za pomoc funkcji cvReleaseHist(). W momencie gdy
stworzony histogram chcemy ponownie wykorzystad przed jego usuniciem, mona uyd
funkcji cvClearHist(), ktra zeruje wartoci w koszykach histogramu pozwalajc na jego
ponowne uycie.
Histogram byby mao przydatny, gdyby uytkownik nie mia dostpu do wartoci
z koszykw. Proces ten w OpenCV odbywa si na dwa sposoby, w zalenoci od potrzeb.
Zdecydowanie prostszym sposobem jest dostp bezporedni za pomoc funkcji
cvQueryHistValue_1D():
double cvQueryHistValue_1D(CvHistogram* hist, int idx0);
Funkcja ta po podaniu numeru indeksu kosza zwraca wartod przez niego przechowywan.
Takie same funkcje tylko ze zmienionym indeksem wymiaru stosowane s dla histogramw 2D
i 3D. Funkcja ta jest przydatna w momencie gdy rzadko siga si po wartoci z koszy.
W momencie gdy wartoci te musz byd analizowane na bieco naley skorzystad z funkcji
cvGetHistValue_1D(), ktre zwracaj wskanik na dany kosz.
OpenCV nie zawiera wbudowanych narzdzi do rysowania histogramu jednak napisanie jej
nie stanowi wikszego problemu dla osb redniozaawansowanych. Przykadowy sposb
wygenerowania histogramu odcieni szaroci na rysunku 47. w OpenCV.
72
73
cvNamedWindow("original",1);
cvNamedWindow("gray",1);
cvNamedWindow("histogram",1);
//obrazy z ktrych zostanie obliczony histogram
IplImage* images[] = { gray };
// przygotowanie pustego histogramu
hist = cvCreateHist( 1, size, CV_HIST_ARRAY, ranges,1);
// obliczenie histogramu z obrazw
cvCalcHist( images, hist, 0, NULL);
// znalezienie minimalnej i maksymalnej wartoci histo
cvGetMinMaxHistValue( hist, &min_val, &max_val);
// tworzenie 8bitowego obrazu do pokazania histogramu
imgHistogram = cvCreateImage(cvSize(256, 50),8,1);
// wypenienie go biaym kolorem
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50),
CV_RGB(255,255,255),CV_FILLED);
//rysowanie histogramu jasnoci pikseli znormalizowanego od 0 do 50
for(int i=0; i < 256; i++){
val = cvQueryHistValue_1D( hist, i);
norm = cvRound(val*50/max_val);
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-norm),CV_RGB(0,0,0));
}
//pokazanie okien z rezultatem
cvShowImage( "original", image );
cvShowImage( "gray", gray );
cvShowImage( "histogram", imgHistogram );
// zapis obrazu histogramu do pliku
cvSaveImage("histogray.jpg",gray);
cvWaitKey();
return 0;
}
Funkcja cvGetMinMaxHistValue():
void cvGetMinMaxHistValue(const CvHistogram* hist,float* min_value, float*
max_value, int* min_idx = NULL, int* max_idx =NULL);
na histogramie byy (w przyblieniu) o takiej samej wysokoci. Po tej operacji niezbyt czytelne
obrazy zyskuj na przejrzystoci. W OpenCV operacj t realizuje funkcja cvEqualizeHist():
void cvEqualizeHist(const CvArr* src,CvArr* dst);
Funkcja ta jako argumenty przyjmuje obraz wejciowy oraz wyjciowy. Poniej przedstawiony
zosta proces wyrwnywania histogramu oraz efekt zmian na obrazie.
Pierwszy parametr image jest wskanikiem do tablicy obrazw. Przed poddaniem obrazu
procesowi wstecznej projekcji musi on zostad podzielony na oddzielne kanay. Nastpnie s
one zapisywane do wspomnianej tablicy. Przy wywoaniu funkcji trzy kanay obrazu
wejciowego s analizowane w tym samym czasie. Drugi argument back_project jest obrazem
wynikowym po projekcji wstecznej, o takich samych parametrach jak obraz wejciowy. Ostatni
parametr hist jest omawianym histogramem.
Rysunek 49 Obraz wejciowy, histogram zostanie obliczony z obszaru zaznaczonego czerwonym prostoktem
Rysunek 50 Obraz po projekcji wstecznej. Wyeksponowane zostay tylko te barwy, ktre najlepiej pasoway do
wartoci z histogramu.
3.9
Analiza ruchu
pole ruchu (ang. motion field) definiowane jest jako zrzutowanie przestrzeni
rzeczywistych trjwymiarowych wektorw na paszczyzn obrazu. Po tej operacji
otrzymane pole wektorowe zawiera informacj tylko o skadowej rwnolegej
ruchu obiektw wzgldem paszczyzny obrazu. W wyniku czego odtworzenie
pierwotnej informacji w oparciu o pole ruchu jest niemoliwe, gdy tracona jest
informacja o skadowej prostopadej.
przepyw optyczny (ang. optical flow) jest rwnie polem wektorowym, ktre
zawiera informacj umoliwiajce przeksztacenie jednego obrazu w drugi
za pomoc wektorw przepywu optycznego wskazujcych kierunek transformacji
obszarw pierwszego obrazu do drugiego.
obraz #1
optical flow
obraz #2
Naley zauwayd istotn rnic pomidzy powyszymi definicjami . Pole ruchu mwi o
rzeczywistym ruchu obiektw, natomiast pole przepywu optycznego interpretuje zmian
kolejnych klatek obrazu. Poniszy rysunek pokazuje prosty przykad pokazujcy rnic
pomidzy omawianymi zagadnieniami.
77
Jak widad pozorny ruch spirali na walcu rejestrowany jest przez pole przepywu optycznego
jako ruch ku grze. Pole ruchu wskazuje rzeczywisty kierunek ruchu walca. Mona przyjd, e
przepyw optyczny na obrazie jest aproksymacj pola ruchu obiektu w rzeczywistoci.
Proces detekcji ruchu na obrazie za pomoc przepywu optycznego jest operacj
wymagajc duej mocy obliczeniowej. Dodatkowo musi byd obarczony pewnymi zaoeniami.
Owietlenie ledzonego obiektu musi byd jednolite, gdy lokalne zmiany jasnoci obiektu mog
byd zidentyfikowane jako ruch. Nastpnie obiekt nie moe byd przeroczysty ani o jednolitym
kolorze, poniewa brak tekstury moe uniemoliwid wykrycie ruchu. Rwnie wektor ruchu
obiektu musi byd rwnolegy do paszczyzny obrazu, aby przepyw optyczny zosta wyznaczony
prawidowo.
3.9.1
czstkowych
3.9.2
Pierwsz z metod gradientowych jest algorytm Lucas Kankade (LK). Pierwsza wersja tego
algorytmu obliczaa wektor przepywu dla kadego punktu obrazu tworzc tzw. gste pole
przepywu. Niedugo potem zostaa wprowadzona modyfikacja algorytmu, ktra obliczaa pole
wektorowe dla zbioru punktw. Wwczas algorytm mg zostad wykorzystany
do wygenerowania rzadkiego pola przepywu, poniewa zalea tylko od okrelonego
ssiedztwa otaczajcego interesujce punkty obrazu. Zdecydowan wad wersji algorytmu
z maym lokalnym oknem, bya niewielka czuod na wikszy ruch, ktry mg zostad nie
wykryty. Problem ten zosta rozwizany z pojawieniem si piramidalnego algorytmu LK.
Algorytm zaczyna analiz obrazu od najwyszego poziomu piramidy obrazu (o najmniejszej
zawartoci detali), schodzc kolejno poziomami w d do poziomw o wikszej szczegowoci.
Realizacja ta pozwala na wykrycie wikszych ruchw oraz na przypieszenie dziaania
algorytmu dziki analizie wczeniejszych jego iteracji.
79
Pierwszy etap zwizany jest ze specyfik metody LK. Poszukiwane s punkty, ktrych
gradient jasnoci ma charakter dwuwymiarowy. Oznacza to, e w otoczeniu tych punktw
wystpuj wyrane zmiany jasnoci w dwch rnych kierunkach. Punktami dobrze nadajcymi
si do ledzenia s naroniki.
W OpenCV funkcj poszukujc takich punktw jest cvGoodFeaturesToTrack():
void cvGoodFeaturesToTrack(
const CvArr* image
CvArr* eigImage, CvArr* tempImage
CvPoint2D32f* corners
int* cornerCount
double qualityLevel
double minDistance
const CvArr* mask=NULL
int blockSize=3
);
Pierwszym parametrem jest obraz wejciowy image, ktry musi byd obrazem 8-bitowym lub
32bitowym jednokanaowym. Nastpne dwa argumenty eigImage i tempImage s 32bitowym
jednokanaowymi obrazami o tym samym rozmiarze co image. Oba te obrazy wykorzystywane
s jako bufory podczas pracy algorytmu. Kolejny argument corners jest 32bitow tablic
zawierajc wsprzdne znalezionych przez algorytm naroy. Parametr corner_counts
zawiera liczb znalezionych naroy, quality_level okrela dokadnod z jak naroa s szukane.
Nastpny parametr minDistanse definiuje minimaln odlegod pomidzy dwoma naroami.
Argument mask jest opcjonalnym operatorem logicznym okrelajcym, ktre punkty obrazu
maj byd brane pod uwag, a ktre nie. Jeeli ustawiony jest na NULL wwczas maska nie jest
wybrana. Kolejny parametr block_size okrela otoczenie piksela, ktre ma byd analizowane.
12
Posiadajc list punktw dobrych do ledzenia uruchamiana jest ptla, w ktrej funkcja
ledzca, ktra przy kadym wywoaniu analizuje nastpna klatk obrazu. Uruchamiana w ptli
piramidalna metoda LK cvCalcOpticalFlowPyrLK() ma nastpujc postad:
12
80
void cvCalcOpticalFlowPyrLK(
const CvArr* imgA,
const CvArr* imgB,
CvArr* pyrA,
CvArr* pyrB,
CvPoint2D32f* featuresA,
CvPoint2D32f* featuresB,
int count,
CvSize winSize, int level,
char* status,
float* track_error,
CvTermCriteria criteria, - kryteria dziaania algorytmu
);
Pierwsze dwa parametry imgA i imgB s kolejnymi analizowanymi klatkami. Kolejne dwa pyrA
i pyrB buforami obrazu piramidy wspomnianych klatek. Nastpne dwa s tablicami punktw
dobrych do ledzenia dla obu klatek. Ilod punktw ledzonych okrela parametr count.
Argument winSize wyznacza wielkod okna poszukiwao dla poziomu piramidy. Flag
poprawnoci wyliczenia przepywu optycznego jest parametr status. Tablica bdw estyma
przesunid track_error jest kolejnym argumentem. Ostatni parametr criteria wyznacza
warunki dziaania algorytmu. Do ich okrelenia stosowane s makra. W celu ustawienia iloci
iteracji na 30 oraz akceptowalnego bdu = 0.01 mona skorzystad z makra:
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,30,0.01)
Rysunek 56 Efekt dziaania algorytmu PyrLK. Czerwonymi kropkami zaznaczone zostay punkty dobre do
ledzenia, a kolorem niebieski trajektoria zmiany pooenia piksela (przepyw optyczny)
81
3.9.2.2
) gdzie
Przyjmujc, e
s gradientami obrazu
( )
82
gdzie
jest sta regularyzacji gwarantujc warunek pynnoci. Minimalizacja jest
realizowana przez znalezienie odpowiednich wartoci wektora prdkoci (
). Po ich
odnalezieniu rwnanie (**) wyznaczy przepyw optyczny.
Iteracyjny sposb rozwizywania tych rwnao zaimplementowany jest w funkcji
cvCalcOpticalFlowHS():
void cvCalcOpticalFlowHS(
const CvArr* imgA, const CvArr* imgB, int usePrevious,
CvArr* velx, CvArr* vely,double lambda,
CvTermCriteria criteria
);
3.9.2.3
Termin block matching zawiera w sobie grup algorytmw, ktre dziel kolejne klatki
sekwencji na mae regiony zwane blokami. S to zazwyczaj kwadratowe obszary zawierajce
okrelon ilod pikseli czsto nachodzce na siebie. Algorytmy dopasowania blokw dziel
poprzedni i aktualn klatk na regiony i nastpnie obliczaj ruch z nimi zwizany. Tego typu
algorytmy odgrywaj znaczc rol w algorytmach kompresji wideo oraz omawianym
przepywie optycznym.
Implementacja w OpenCV wykorzystuje algorytm SS (ang. spiral search) przeszukiwania
obrazu aktualnego w celu znalezienia bloku z klatki poprzedniej. Metoda ta polega
na przeszukiwaniu ssiednich blokw pikseli poczwszy od rodka spirali (miejsca, w ktrym
blok znajdowa si na wczeniejszej klatce) na zewntrz poruszajc si po spirali.
Przeszukiwane bloki porwnywane s na podstawie wspczynnika dopasowania SAD (ang.
Sum of Absolute values of the Differences) okrelajcego sum wartoci bezwzgldnych rnic
pomidzy wartociami pikseli w porwnywanych blokach [14].
Funkcj realizujc dopasowanie blokowe w OpenCV jest cvCalcOpticalFlowBM():
void cvCalcOpticalFlowBM(
const CvArr* prev, const CvArr* curr,
CvSize block_size, CvSize shift_size,
CvSize max_range, int use_previous,
CvArr* velx,
CvArr* vely
);
83
Pierwsze swa parametry prev i curr s poprzedni i aktualnym obrazem. Oba musz byd
8-bitowym, jednokanaowym obrazem. Argument block_size okrela rozmiar bloku
wydzielonego z obrazu. Kolejny parametr shift_size okrela odstp pomidzy kolejnymi
blokami pikseli (w tym miejscu okrela si moliwod tego czy bloki bd na siebie nachodzid).
Parametr max_range okrela maksymaln odlegod w jakiej znajdowad si mog blok z klatki
poprzedniej i odpowiadajcy mu blok w klatce aktualnej. Parametr use_previous zosta
omwiony w przypadku funkcji cvCalcOpticalFlowHS(). Ostatnie dwa argumenty velx oraz
vely zawieraj obliczony ruch pomidzy blokami kolejnych klatek w paszczynie X oraz Y.
Fakt tego, e ruch wykrywany jest na bloku a nie na pojedynczym pikselu zmniejsza
w znaczcy sposb zoonod obliczeniow algorytmu obliczajcego przepyw optyczny. Na
obrazie poniej znajduj si przykadowa realizacja opisywanego algorytmu dla dwch
obrazw.
84
13
85
rwnie obiekty, ktrych ksztat si zmienia w trakcie trwania sekwencji wideo. Automatycznie
dopasowuje wielkod okna przeszukiwao w zalenoci od wielkoci obszaru zawierajcego
poszukiwane cechy obiektu. Mona zwikszyd wydajnod dziaania metody poprzez zaoenie
niewielkiego ruchu ledzonego obiektu. W przypadku ledzenia twarzy algorytm obliczy
w pierwszym kroku histogram rozkadu np. koloru skry z okrelonego okna przeszukiwao.
Nastpnie wyznaczy jego rodek cikoci, aby w nastpnej analizowanej klatce zwikszyd
jedynie nieznacznie okno przeszukiwao i analizowad piksele go obejmujce. Dziki temu
pozostae piksele obrazu s ignorowane. W OpenCV funkcj realizujc t metod jest
cvCamShift():
int cvCamShift(
const CvArr* prob_image,
CvRect window,
CvTermCriteria criteria,
CvConnectedComp* comp,
CvBox2D* box = NULL
);
W przypadku tej funkcji dodatkowym parametrem jest element strukturalny box bdcy
prostoktem otaczajcym ledzony obiekt (zawiera informacj o jego rozmiarach). Poniej
przedstawione zostao dziaanie metody cam-shift za pomoc programu demonstracyjnego
camshiftdemo.exe umieszczonego w katalogu biblioteki OpenCV2.1/Samples/c/.
86
4. Realizacja praktyczna
Zagadnienia praktyczne byy realizowane przy pomocy kamery internetowej Logitech Pro
9000 o optyce Carl Zeiss duej ostroci i wysokiej 2MPix rozdzielczoci. Kamera to zastaa
wybrana ze wzgldu na dobr jakod obrazu oraz szerokich moliwoci programowych doboru
parametrw analizowanego obrazu.
4.1
Finger Drawing
4.1.1
Realizacja
Przetwarzanie
Akwizycja obrazu
Interfejs
Rysowanie
87
4.1.2
Problemy
4.1.3
4.1.3.1
88
4.1.3.2
Kolejnym etapem jest wyliczenie histogramu zaznaczonej doni, ktry jest kluczowy
w dziaaniu algorytmu odnajdujcego tony skrne. Naley zwrcid uwag na to, i histogram
jest obliczany tylko raz, na pocztku algorytmu. Obliczanie histogramu odbywa si za pomoc
funkcji cvCalcHist(). Funkcja ta oblicza histogram tylko i wycznie barwy czyli kanau Hue
89
z przestrzeni HSV. W tym celu jako pierwszy argument przyjmuje kana Hue obrazu z kamery,
drugim argumentem jest zwracany histogram, a ostatni parametr to obliczona funkcj
cvInRangeS() maska binarna.
4.1.3.3
90
4.1.4
Obsuga programu
dobrane w taki sposb, aby na obrazie maski widoczne byy tylko efekty skrne kolor biay,
za to powinno byd widoczne jako kolor czarny.
Po odpowiednim przygotowaniu maski naley pobrad histogram doni zaznaczajc j
prostoktnym obszarem wyznaczaniem za pomoc myszki i zaakceptowad go naciskajc
klawisz b. Obliczony histogram mona zobaczyd w oddzielnym oknie po naciniciu klawisza
h. Po operacji obliczenia histogramu w oknie capture pojawia si gwny interfejs
programu, ktry skada si z przyciskw do tworzenia obiektw i ich edycji oraz dwch
pointerw do sterowania interfejsem. Widoczne s rwnie kontury doni, ktre mona
wyczyd przyciskajc klawisz a.
Uytkownik dodatkowo moe w kadej chwili rozpoczd nagrywanie swojej pracy
przyciskajc klawisz c. W oknie, ktre si pojawi naley wybrad jeden z kodekw
obsugiwanych przez OpenCV. Polecany jest kodek XVID o dobrym stosunku kompresji
do jakoci wideo.
Za pomoc klawisza f uytkownik moe rwnie obserwowad swoj prac na penym
ekranie, a nie w domylnym oknie o rozdzielczoci 640x480.
4.1.5
Moliwo rozwoju
Program posiada due moliwoci rozwoju. Midzy innymi mona byoby go wzbogacid
o wykrywanie gestw rki, ktre przypisane byyby do konkretnej operacji.
Due pole do manewru pozostawia sposb nastrajania kamery w celu jak najlepszego
wykrycia barw skry. Zastosowanie metody bardziej zautomatyzowanej uatwioby prac
z oprogramowaniem.
Sam algorytm wykrywania i ledzenia doni mona byoby oprzed na analizie ruchu
obiektw. Na przykad zastosowad algorytm przepywu optycznego (ang. opticalFlow) opisany
w czci teoretycznej. Rwnie opracowanie wasnego klasyfikatora Haara dla doni
rozbudowujc w ten sposb proces ledzenia. Naley jednak pamitad, e wszystkie
wspomniane udoskonalenia zwikszaj znacznie zoonod obliczeniow programu
i wprowadzaj due opnienia, ktre w warunkach domowych mog wrcz utrudnid prac
z programem.
94
4.2
Face Detect
4.2.1
Realizacja
Przetwarzanie
Akwizycja obrazu
detekcja twarzy
4.2.2
Problemy
W celu lepszej detekcji twarzy za pomoc algorytmu Haar-Like wykorzystywane byy tony
skrne, ktre pozwalay na wyodrbnienie obszaru ograniczajcego dziaanie algorytmu.
Tak samo jak w przypadku programu Finger Draw wpyw na identyfikacje koloru skry miay
warunki owietleniowe. Kolor skry w zalenoci od owietlenia zmienia swoje parametry.
Drugim problemem jest stworzenie wasnego klasyfikatora Haara do metody.
Zgromadzenie rozbudowanej bazy danych pozytywnych zdjd twarzy oraz negatywnych zdjd
otoczenia wymaga sporego nakadu czasowego. Projekt wic zosta oparty o umieszczony w
bibliotece klasyfikator stworzony przez twrcw biblioteki.
4.2.3
4.2.3.1
95
96
Obraz oryginalny
(0,0)
Suma wszystkich
pikseli z szarego
regionu
(x, y)
(x, y)
Obraz oryginalny
R
c
sum R = d - c - b + a
Rysunek 75 Obliczanie sumy pikseli regionu R obrazu rdowego za pomoc
czterech punktw obrazu zintegrowanego
97
f1
1
f2
1
f3
1
fn
1
Okna z
poszukiwanymi
obiektami
Odrzucone okna
Rysunek 76 Budowa klasyfikatora kaskadowego
Utworzony klasyfikator zapisywany jest do pliku XML. Wykorzystujc dodatkowy zbir obrazw
pozytywnych i negatywnych, ktre nie bray udziau w procesie uczenia si mona
przetestowad klasyfikator w programie performance.exe. Dokadny opis konfigurowania oraz
obsugi programw mona znaled w rdle *W9].
4.2.3.2
4.2.3.3
W celu zminimalizowania obszaru analizowanego przez funkcj wykrywajc twarze (HaarLike) obliczane s kontury z obrazu maski za pomoc funkcji cvFindContours(). Nastpnie
punkty konturw zapisane w sekwencji, konwertowane s do tablicy punktw
z wykorzystaniem funkcji cvCvtSeqToArray(). Punkty tablicy analizowane s przez funkcje
cvBoundingRect() w poszukiwaniu najbardziej zewntrznych punktw. Po ich znalezieniu po
konturze, obrysowywany jest zielony prostokt, ktry nastpnie jest powikszany programowo
z wykorzystaniem dowiadczalnie dobranej skali. Powierzchnia prostokta stanowi ograniczony
obszar do analizy przez algorytm Haar-Like. Po znalezieniu twarzy algorytm Haara generuje
czerwony prostokt, w ktrym znajduj si wykryta twarz.
99
Rysunek 78 Obliczony kontur i naoony prostokt stanowicy ROI dla algorytmu Haar-Like
4.2.4
Moliwoci rozwoju
4.3
Line Assist
4.3.1
Realizacja
Program Line Assist ma za zadanie wykryd linie drogi i na ich podstawie okrelid sposb
sterowania kierownic samochodu. Program dziaa w czasie rzeczywistym, analizujc
na bieco stan drogi.
Przetwarzanie
Akwizycja klatki
detekcja drogi
4.3.2
Problemy
101
4.3.3
4.3.3.1
102
4.3.3.2
4.3.3.3
103
LD.x - LG.x
PD.x - PG.x
4.3.4
Moliwoci rozwoju.
Program daje moliwod rozwoju pod ktem oprogramowania oraz pod ktem urzdzeo
zastosowanych do jego dziaania. Przede wszystkim kamera, ktra analizowaaby obraz drogi
musiaaby byd zamontowana na stae. Program nie byby naraony na wzajemn dyslokacj
kamery i samochodu. Wprowadzone zmiany w oprogramowaniu mog dotyczyd lepszego
odwzorowania skrtu kierownicy na podstawie krzywizny drogi. Z wykorzystaniem analizy
ruchu mona wprowadzid komunikaty zwizane z ograniczeniem prdkoci samochodu.
Kolejnym udoskonaleniem mogaby byd detekcja znakw drogowych rwnie pozwalajca
na generowanie ostrzeeo i dodatkowych komunikatw dla kierowcy. Wyposaenie programu
w funkcj detekcji pieszych pozwolioby na zachowanie wikszej ostronoci przez
prowadzcego samochd wyposaony w takie oprogramowanie.
Program w wersji rozbudowanej o wspomniane pomysy byby dobrym narzdziem
do zwikszenia bezpieczeostwa na drodze jak oraz wsparciem dla mao dowiadczonego
kierowcy.
104
5. Podsumowanie
Celem niniejszej pracy byo przedstawienie potencjau biblioteki graficznej OpenCV do
tworzenia zaawansowanych systemw wizyjnych. W pierwszej czci pracy opisane zostay
najbardziej popularne i efektywne funkcje realizujce metody przetwarzania obrazw suce
do m.in. rozpoznawania i analizy ruchu obiektw, filtracji, wykrywania konturw czy tworzenia
histogramw. W czci drugiej na podstawie opisanych algorytmw zostay zaprojektowane
trzy systemy, ktrych funkcjonalnod pozwalaa na wykrywanie i liczenie twarzy na obrazie,
rysowanie obiektw geometrycznych za pomoc dwch rk jednoczenie (ang. Multi-touch)
oraz analizuj
105
Literatura
[1] W.Wayt Gibbs, Innovations from a Robot Rally, Scientific American 2005
[2] T. Grey Color confidence: the digital photographer's guide to color management,
Sybex 2004
[3] E. Rafajowicz, W. Rafajowicz, A. Rusicki Algorytm przetwarzania obrazw i wstp
do pracy z bibliotek OpenCV, Oficyna Wydawnicza Politechniki Wrocawskiej.
Wrocaw 2009
[4] A. Korzyoska Przetwarzanie obrazw dwiczenia, Wydawnictwo PJWSTK,
Warszawa 2005
[5] J. Wilk, Techniki cyfrowego rozpoznawania krawdzi obrazw, Wydawnictwo
Stowarzyszenia Polska-Wchd, Kielce 2006
[6] R. C. Gonzlez, R. E. Woods Digital image Processing, Pearson Prentice Hall 2008
[7] E. Davies Machine
Academic Press 1990
Vision:
Theory,
Algorithms
and
Practicalities,
Strony internetowe
[W1]
[W5]
[W6]
[W7]
rdo zdjcia:
http://www.cs.bham.ac.uk/resources/courses/robotics/doc/opencvdocs/ref/pi
cs/ellipse.png
[W8]
Aplet Java:
http://www.rob.cs.tu-bs.de/content/04-teaching/06-interactive/HNF.html
[W9]
107
Spis Rysunkw
Rysunek 1 Statystyki pobrao biblioteki OpenCV ze strony projektu........................................... 11
Rysunek 2 Tworzenie nowego projektu w VS2010 Express ........................................................ 12
Rysunek 3 Widok tworzenia nowego projektu ........................................................................... 12
Rysunek 4 Okno waciwoci projektu ........................................................................................ 13
Rysunek 5 Okno dodawania dodatkowych cieek dostpu ...................................................... 13
Rysunek 6 Architektura OpenCV ................................................................................................. 14
Rysunek 7 Przekrj tonw skali szaroci ..................................................................................... 22
Rysunek 8 Model RGB przestrzeni kolorw. ............................................................................... 23
Rysunek 9 Model HSV przestrzeni kolorw. ............................................................................... 24
Rysunek 10 Przykady zastosowania obsugi myszy w HighGUI.................................................. 31
Rysunek 11 Przykad zastosowania suwakw jako przyciskw .................................................. 33
Rysunek 12 Przykad zastosowania ROI na obrazie. ................................................................... 35
Rysunek 13 Sposb rysowania Elipsy w HighGUI ........................................................................ 38
Rysunek 14 Progowanie binarne, binarne odwrcone, proste, proste odwrcone, okrawajce
..................................................................................................................................................... 41
Rysunek 15 Przykad dziaania progowania adaptacyjnego........................................................ 42
Rysunek 16 Maska splotu o rozmiarze 3 x 3. .............................................................................. 43
Rysunek 17 Obliczanie pierwszej i drugiej pochodnej obszarw o zmiennej jasnoci *5+ .......... 45
Rysunek 18 Zastosowanie rnych operatorw kierunkowych Sobela dla obrazu w skali szaroci
..................................................................................................................................................... 47
Rysunek 19 Zastosowanie operatora kombinowanego 3x3 i 5x5 dla filtru Sobela .................... 48
Rysunek 20 Zastosowanie filtru Laplace'a do wykrywania krawdzi .......................................... 49
Rysunek 21 Zastosowanie filtru Canny'ego do detekcji krawdzi .............................................. 50
Rysunek 22 Zasada dziaania funkcji cvFindContours(). ...................................................... 51
Rysunek 23 Kod aocuchowy Freemana...................................................................................... 55
Rysunek 24 Obraz wejciowy przed wykryciem konturw. ........................................................ 56
Rysunek 25 Obraz wejciowy po wykryciu konturw. Dla parametru max_level = -3, -2, -1, 0, 1,
2, 3 poczwszy od obrazu w lewym grnym rogu. ..................................................................... 56
Rysunek 26 Przykadowa maska filtru Gaussa ............................................................................ 57
Rysunek 27 Zastosowanie filtru Gaussa dla jednowymiarowej macierzy pikseli [8] .................. 58
Rysunek 28 Zastosowanie rozmycia a - medianowego, b gaussowskiego............................... 58
Rysunek 29 Realizacja klasycznej transformaty Hougha............................................................. 59
Rysunek 30 Realizacja transformaty Hougha dla linii prostych. Obrazy przestrzeni (x, y) oraz
przestrzeni parametrycznej (theta, r) ......................................................................................... 60
Rysunek 31 Zasada wypeniania elementw akumulatora. ........................................................ 61
Rysunek 32 Wykrywanie okrgw dla CHT przy znanym promieniu R. ...................................... 62
Rysunek 33 Programowa detekcja rodka okrgu dla CHT......................................................... 63
Rysunek 34 Detekcja okrgw na obrazie za pomoc CHT. ....................................................... 64
Rysunek 35 Dylatacja. Obliczanie wartoci piksela za pomoc elementu strukturalnego ......... 66
Rysunek 36 Element strukturalny w ksztacie okrgu................................................................ 66
Rysunek 37 Element strukturalny w ksztacie prostokta. ......................................................... 66
Rysunek 38 Element strukturalny w ksztacie prostokta. ......................................................... 66
108
110
111