You are on page 1of 111

Akademia Grniczo-Hutnicza

im. Stanisawa Staszica w Krakowie


Wydzia Elektrotechniki, Automatyki, Informatyki i Elektroniki
Katedra Automatyki

PRACA MAGISTERSKA
SEBASTIAN WOJAS

Metody przetwarzania obrazw z


wykorzystaniem biblioteki OpenCV

PROMOTOR:
DR P AWE ROTTER

KRAKW 2010

OWIADCZENIE AUTORA PRACY


OWIADCZAM, WIADOMY ODPOWIEDZIALNOCI KARNEJ ZA
POWIADCZENIE NIEPRAWDY , E NINIEJSZ PRAC DYPLOMOW
WYKONAEM OSOBICIE I SAMODZIELNIE I E NIE KORZYSTAEM
ZE RDE INNYCH NI WYMIENIONE W PRACY .

_________________
PODPIS

AGH University of Science and Technology

Faculty of Electrical Engineering, Automatics, Computer Science and


Electronics

MSc THESIS
SEBASTIAN WOJAS

Practical applications of image


analysis using OpenCV

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

INTERESUJCEJ MNIE TEMATYKI PRACY ORAZ


CZAS POWIECONY NA DYSKUSJE NAD JEJ
ZAGADNIENIAMI .

Spis Treci
1.

2.

Wstp ................................................................................................................................... 8
1.1

Cele i zaoenia ......................................................................................................................... 8

1.2

Zawartod pracy ....................................................................................................................... 8

1.3

Wstp do cyfrowego przetwarzania obrazw ......................................................................... 9

1.4

Wstp do biblioteki OpenCV .................................................................................................... 9

1.4.1

Rozwj projektu i zgodnod ........................................................................................... 10

1.4.2

Pobieranie i instalacja .................................................................................................... 11

1.4.3

Dokumentacja ................................................................................................................ 14

1.4.4

Architektura OpenCV ..................................................................................................... 14

Podstawy OpenCV ............................................................................................................... 15


2.1

2.1.1

Statyczne struktury danych ............................................................................................ 15

2.1.2

Dynamiczne struktury danych ........................................................................................ 18

2.1.3

Pomocnicze struktury danych ........................................................................................ 21

2.2

Praca z obrazami ....................................................................................................................21

2.2.1

Tworzenie, kopiowanie i usuwanie obrazw ................................................................. 21

2.2.2

Przestrzenie barw i ich konwersja .................................................................................. 22

2.3

Tworzenie interfejsu uytkownika .........................................................................................25

2.3.1

Obsuga okien ................................................................................................................. 25

2.3.2

Wczytywanie, wywietlanie i zapisywanie obrazw. ..................................................... 26

2.3.3

Odczytywanie i zapisywanie danych z kamery oraz plikw wideo ................................ 27

2.3.4

Obsuga myszy................................................................................................................ 30

2.3.5

Dodawanie i wykorzystywanie suwakw ....................................................................... 32

2.4

3.

Typy danych ...........................................................................................................................15

Operacje na macierzach i obrazach .......................................................................................33

2.4.1

Dostp do pikseli obrazw ............................................................................................. 33

2.4.2

Dostp do fragmentw obrazu ...................................................................................... 34

2.4.3

Obszar ROI i COI ............................................................................................................. 35

2.4.4

Operacje macierzowe..................................................................................................... 36

2.4.5

Rysowanie ksztatw ...................................................................................................... 37

2.4.6

Wstawianie tekstu.......................................................................................................... 39

Przetwarzanie obrazw ....................................................................................................... 40


3.1

Progowanie ............................................................................................................................40
5

3.2

Przeksztacenia kontekstowe i konwolucja ............................................................................43

3.3

Filtry do detekcji krawdzi .....................................................................................................44

3.3.1

Filtr Sobela...................................................................................................................... 46

3.3.2

Filtr Laplacea ................................................................................................................. 48

3.3.3

Filtr Cannygo ................................................................................................................. 49

3.4

3.4.1

Kontury i ich interpretacja ............................................................................................. 51

3.4.2

Operacje na konturach ................................................................................................... 53

3.4.3

Kod aocuchowy Freemana ............................................................................................ 54

3.4.4

Rysowanie konturw...................................................................................................... 55

3.5

Rozmycie ................................................................................................................................56

3.6

Transformata Hougha ............................................................................................................59

3.6.1

Wykrywanie linii ............................................................................................................. 59

3.6.2

Wykrywanie okrgw..................................................................................................... 62

3.7

Przeksztacenia morfologiczne ...............................................................................................65

3.8

Histogramy .............................................................................................................................70

3.9

Analiza ruchu ..........................................................................................................................76

3.9.1

Metody ledzenia ruchu ................................................................................................. 78

3.9.2

Opis i implementacja wybranych metod ....................................................................... 79

3.10
4.

Kontury ...................................................................................................................................51

ledzenie obiektw ................................................................................................................84

Realizacja praktyczna........................................................................................................... 87
4.1

Finger Drawing .......................................................................................................................87

4.1.1

Realizacja ........................................................................................................................ 87

4.1.2

Problemy ........................................................................................................................ 88

4.1.3

Opis dziaania programu ................................................................................................ 88

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

Opis dziaania programu ................................................................................................ 95

4.2.4

Moliwoci rozwoju...................................................................................................... 100

4.3

Line Assist .............................................................................................................................101

4.3.1

Realizacja ...................................................................................................................... 101


6

5.

4.3.2

Problemy ...................................................................................................................... 101

4.3.3

Opis dziaania programu .............................................................................................. 102

4.3.4

Moliwoci rozwoju...................................................................................................... 104

Podsumowanie.................................................................................................................. 105

Literatura ................................................................................................................................. 106


Spis Rysunkw .......................................................................................................................... 108
Dodatek. Opis plikw programw ............................................................................................ 111
Program Finger Draw .......................................................................................................................111
Program Face Detect ........................................................................................................................111
Program Line Assist ..........................................................................................................................111

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

Wstp do cyfrowego przetwarzania obrazw

Kadego dnia dokonujemy decyzji na podstawie analizy informacji odbieranych przez


narzdy zmysw. Najwicej danych, bo a 90% dostarczaj oczy, dlatego te gwnie na
podstawie tego, co widzimy podejmujemy odpowiednie dziaania. W celu zautomatyzowania
stanowiska pracy zajmowanego przez czowieka, naley budowad urzdzenia bazujce na wizji
maszynowej automatyczne systemy wizyjne, bdce elektronicznym odpowiednikiem
wzroku.
Faktem jest, i efektywnod wykorzystywania wspomnianych systemw ronie z dnia na
dzieo. Co wicej, coraz wicej gazi nauki czerpie z duych moliwoci jakie daje przetwarzanie
obrazw. Znanymi od wielu lat dziedzinami wykorzystujcymi analiz obrazu s:

1.4

Medycyna analiza obrazw biomedycznych (np. radiografia, rezonans


magnetyczny,
tomografia
komputerowa,
ultrasonografia,
morfologia,
mammografia cyfrowa. Za pomoc przetwarzania obrazw zaobserwowano m.in.
62% wzrost skutecznoci diagnozy podowych wad rozwojowych i ginekologii, 28%
wzrost iloci informacji diagnostycznej przy badaniach wtroby i przewodu
ciowego),
Astronomia,
Robotyka,
Radiologia,
Metrologia,
Sejsmologia,
Metalurgia,
Systemy zabezpieczeo i wiele innych.

Wstp do biblioteki OpenCV

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

Rozwj projektu i zgodno

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

Rysunek 1 Statystyki pobrao biblioteki OpenCV ze strony projektu.

Pierwsza wersja alpha biblioteki zostaa udostpniona w roku 2000. Nastpne,


udoskonalone wersje to: Beta 1 2001 (wsparcie dla Linuxa), Beta 2 2002, Beta 3
2003, Beta 4 2004, Beta 5 2005. Oficjalna wersja OpenCV o nazwie 1.0 powstaa
dopiero w padzierniku 2006 roku. Spora aktywnod deweloperw w kierunku rozwijania
projektu spowodowaa powstawanie kolejnych wersji: 1.1pre1 2008, 2.0 2009. Od
kwietnia 2010 roku dostpna jest wersja 2.1. Z informacji zawartych na stronie projektu
wynika, e wersja 2.2 ma pojawid si w padzierniku 2010 roku.
Biblioteka OpenCV przeznaczona jest do pracy z systemami Linux, MacOS oraz Windows
pod kompilatorami Visual Studio 2005, 2008 (wraz z wersjami Express), MinGW Windows
oraz GCC 4.x Linux i MacOS.

1.4.2

Pobieranie i instalacja

Aplikacje stworzone na potrzeby tej pracy projektowaem za pomoc aktualnej wersji


OpenCV oraz rodowiska Visual Studio C++ 2010 Express. Visual Studio Express jest wersj
darmow, ktr mona pobrad ze strony[W3] w wersji webowej i pniej zainstalowad z
wykorzystaniem dostpu do Internetu. Jak ju wspomniaem przy okazji statystyk, bibliotek
mona pobrad ze strony projektu najlepiej wersj wykonywaln (OpenCV-2.1.0-win32vs2008.exe). Nastpnie instalujemy OpenCV otwierajc cignity plik. Wskazujemy miejsce
docelowe instalacji biblioteki (domylnie C:\OpenCV2.1) wraz z okreleniem zmiennej
systemowej PATH informuje system, w ktrym miejscu znajduj si pliki dynamicznych
bibliotek DLL (Dinamic-Link Library) OpenCV. Po zainstalowaniu moemy przejd do tworzenia
nowego projektu. W tym celu otwieramy Visual Studio C++ Express z menu START. Nastpnie
otwieramy nowy projekt:

11

Rysunek 2 Tworzenie nowego projektu w VS2010 Express

Klikamy na Win32 Console Application i nadajemy projektowi unikaln nazw


PierwszyProjekt.

Rysunek 3 Widok tworzenia nowego projektu

Nastpnie musimy zmienid ustawienia projektu klikajc Project-> Properties, nastpnie


Confiuguration Properties -> VC++ Directiores dodajc cieki dostpu dla:

Include Directories dodajemy C:\OpenCV2.1\include\opencv,


Library Directories dodajemy C:\OpenCV2.1\lib,
Source Directiores dodajemy C:\OpenCV2.1\src,
Executables Directiores dodajemy C:\OpenCV2.1\bin.

12

Rysunek 4 Okno waciwoci projektu

W pozycji Linker->Input->Additional Dependencies dodajemy 'cv210d.lib; cxcore210d.lib;


highgui210d.lib.

Rysunek 5 Okno dodawania dodatkowych cieek dostpu

Nastpnie zamykamy wszystkie okna i przechodzimy do widoku projektu. Naley pamitad


eby na pocztku pliku projektu dodad cztery pliki nagwkowe:
#include
#include
#include
#include

<cv.h>
<cxcore.h>
<highgui.h>
<cvaux.h>

Doczenie tych plikw pozwala na dostp do wikszoci algorytmw zawartych w OpenCV.


13

1.4.3

Dokumentacja

Gwna dokumentacja w formacje HTML oraz PDF znajduj si w podkatalogu


OpenCV2.1/doc, ktry zosta stworzy przy instalacji biblioteki na naszym komputerze. Znajduj
si tam opis biblioteki jak i podrcznik uytkownika opisujcy ca zawartod biblioteki.
Bardzo poytecznym rdem wiedzy jest rwnie strona Wiki OpenCV, kilkukrotnie przeze
mnie przytoczona, na ktrej znajduj si aktualne informacje. Wsparcie oraz pomoc przy
projektowaniu, mona znaled na wczeniej wspomnianym forum dyskusyjnym serwisu Yahoo.

1.4.4

Architektura OpenCV

OpenCV skada si z piciu podstawowych komponentw:


CV oraz CVaux komponenty zawierajce funkcj transformacji, filtracji oraz konwersji
przestrzeni obrazw, funkcj analizy obrazw takie jak selekcja, operacje morfologiczne,
detekcj krawdzi oraz obsug histogramw, detekcj obiektw, kalibracj kamery,
rekonstrukcj sceny 3D i inne,
MLL Machine Learning Library, jak sama nazwa wskazuje zawiera funkcje tworzenia
klasyfikatorw bazujcych na statystyce odgrywajcych znaczc rol w uczeniu maszyn
sposobu detekcji,
HighGUI zawiera metody akwizycji i zwalniania obrazw, sekwencji wideo, narzdzia
tworzenia interfejsu okienkowego, suwakw, obsugi myszy etc.
CxCore Podstawowy komponent biblioteki zawiera operacje na tablicach, algebr
macierzy, funkcje matematyczne, transformacje Fouriera, wsparcie dla plikw XML, narzdzia
rysowania obiektw 2D i inne.

Rysunek 6 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.
[

],

Ktr zapisujmy jako cig liczb


elementy macierzy
zapisywane wierszami od lewej do prawej. Dostp do elementw macierzy obrazuje
nastpujcy wzr matematyczny
, gdzie w szerokod obrazu (macierzy).
Naley rwnie wspomnied o pewnych konwencjach przyjtych w bibliotece OpenCV,
uatwi to przyswajanie informacji w dalszej czci pracy. Twrcy biblioteki przyjli okrelony
sposb nazewnictwa, mianowicie:
- struktury oraz klasy zaczynaj si od prefiksu Cv i s pisane metod czenia sw, gdzie
kade pisane jest od duej litery(tzw. CamelCase), np. cvCreateImage (tworzenie obrazu),
- funkcje, ktre wsppracuj z powyszymi klasami i strukturami zaczynaj si od prefiksu
cv i rwnie s pisane systemem CamelCase.

2.1.1

Statyczne struktury danych

Biblioteka zawiera trzy podstawowe statyczne struktury danych. S to IplImage, CvMat


oraz CvArr. Kolejnod wymienienia tych struktur nie jest przypadkowa. OpenCV pisana jest
w C, ale ma charakter obiektowy, dlatego gdyby powysze struktury byy klasami, a nie
klasycznymi strukturami, mona byoby mwid tutaj o schemacie dziedziczenia IplImage
dziedziczy od CvMat, CvMat za od CvArr. W programowaniu proceduralnym moemy
powiedzied, e struktury te s strukturami pochodnymi.
Struktura CvMat opisuje macierze dwuwymiarowe. Analizujc temat macierzy w OpenCV
naley zdad sobie spraw z faktu, i s one bardziej abstrakcyjne ni macierze, ktre
wykorzystywane s w matematycznej algebrze liniowej. Elementy macierzy w OpenCV
reprezentowane s przez dwa parametry opisujce gbie elementu oraz jego przestrzeo
15

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;

Macierze mona tworzyd na kilka sposobw. Najpopularniejszym sposobem jest


wykorzystanie funkcji cvCreateMat(). Pena jej deklaracja wyglda nastpujco:
CvMat* cvCreateMat( int rows, int cols , int type)

Argumentami funkcji s wymiary macierzy oraz typ danych elementw w niej zawartych.
Wspomnian

funkcj mona zastpid dwiema bardziej bazowymi funkcjami


cvCreateMatHeader() oraz cvCreateData(). Pierwsza z tych dwch funkcji tworzy wycznie
nagwek macierzy, bez alokacji pamici, druga za zajmuje si przydzieleniem pamici
na dane macierzy:
CvMat* mat = cvCreateMatHeader( int rows,int cols, int type );
cvCreateData( mat );

Wspomniane funkcje bazowe uywane s rwnie niezalenie, na przykad w momencie


kiedy chcemy stworzyd macierz, ale nie chcemy jeszcze jej przydzielad pamici, lub
w momencie gdy pamid jest przydzielona ale z innego rda. Jednokadn kopie macierzy
moemy utworzyd za pomoc funkcji cvCloneMat(CvMat*) Gdy macierz, ktra zostaa
stworzona nie jest ju wicej potrzebna, wystarczy uyd funkcji cvReleaseMat(CvMat*).
Wszystkie wspomniane funkcje zwracaj wskanik do utworzonej macierzy.
16

Dostp do elementw macierzy odbywa si rwnie na kilka sposobw. W tej pracy


zostanie umieszczony tylko podstawowy, najczciej uywany gdy jest on najprostszy
w implementacji i zupenie wystarczajcy do szerokiej gamy zastosowao. Wykorzystuj on
wbudowane w OpenCV makro CV_MAT_ELEM(), ktre ze wskazanej macierzy pobiera wartod
interesujcego nas elementu.
CvMat* mat = cvCreateMat (3, 3, CV_8UC1);
int elem22 = CV_MAT_ELEM(*mat, int, 2, 2);

Wynikiem tej operacji bdzie przypisanie do zmiennej elem22 wartoci wskazanego


elementu macierzy.
Nastpnym podstawowym formatem jest IplImage, ktry wykorzystywany jest do obsugi
obrazw. Format ten jest rozbudowan wersj CvMat. Dziki IplImage macierze
interpretowane s jako obrazy. Struktura ta pochodzi z innej biblioteki stworzonej przez firm
Intel, a mianowicie IPL (Image Processing Library). Format ten jest quasi-standardem w
przetwarzaniu obrazw, dlatego zostanie opisany bardzo dokadnie. Struktura IplImage
wyglda nastpujco:
typedef struct _IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
} IplImage;

Poniej przedstawiony jest opis parametrw:

nSize rozmiar obrazu,


ID wersja,
nChannels liczba kanaw, standardowo okrela przestrzeo kolorw. Przyjmuje

wartoci od 0 (obrazy czarno-biae) do 4 (obrazy w przestrzeni RGB + alpha)


alphaChannel parametr ignorowany w OpenCV,
17

depth tzw. gbia, czyli ilod bitw na piksel. Przyjmuje nastpujce wartoci:

- IPL_DEPTH_8U(8S), 8-bitw bez znaku (ze znakiem),


- IPL_DEPTH_16U(16S), 16-bitw bez znaku (ze znakiem),
- IPL_DEPTH_32S, 32- bitw ze znakiem,
-IPL_DEPTH_32F, 32-bitowa liczba zmiennoprzecinkowa,
-IPL_DEPTH_64F, 64-bitowa liczba zmiennoprzecinkowa.
colorModel[4], channelSeq[4] parametry ignorowane przez OpenCV,
dataOrder okrela sposb rozmieszczenia kanaw przestrzeni obrazw,
oddzielnie (wartod 1), lub razem (wartod 0),
origin wskazuje kierunek zapamitywania wierszy pikseli obrazu, od grnego
wiersza (wartod IPL_ORIGIN_TL) lub od dolnego wiersza (wartod
IPL_ORIGIN_BL),
width szerokod obrazu,
height wysokod obrazu,
1
*roi wskanik na struktur IplROI . Struktura ta zawiera prostoktny obszar,
ktry bdzie podlega przetwarzaniu oraz obszar COI2, ktry rwnie bdzie
przetwarzany,
*maskROI, *imageId, *tileInfo parametry nie uywane w OpenCV,
imageSize rozmiar obrazu w bajtach,
*imageData wskanik na pierwszy wiersz w obrazie,
widthStep ilod bitw w jednej linii obrazu, (w CvMat ten parametr nazwany by
step)
BorderMode[4], BorderConst[4] parametry ignorowane w OpenCV,
*imageDataOrigin parametr mao uywany w OpenCV.

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

Dynamiczne struktury danych

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

ROI ang. Region of Interest obszar zainteresowania


COI ang. Channel of interest - kana zainteresowania

18

sposobu przydzielania pamici, dlatego bloki pamici s naprawd czsto wykorzystywanymi


obiektami biblioteki. Bufor pamid alokowany jest za pomoc funkcji:
void* cvMemStorageAlloc( CvMemStorage* storage, size t_size),

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)

oraz czycimy za pomoc


void cvClearMemStorage(cvMemStorage** storage)

gdzie parametrem jest wskanik na interesujcy nas blok.


Bloki pamici, w zalenoci od rozmiaru sekwencji s zapeniane na dwa sposoby. Jeeli
danych sekwencji jest wicej ni jest w stanie pomiecid jeden blok pamici, to dzielona zostaje
na kilka blokw, ktre nazywane s blokami sekwencji. W przypadku gdy sekwencje potrzebuj
mao pamici, to w jednym bloku pamici mona zmiecid kilka takich sekwencji. Sekwencje
zaimplementowane s w oparciu o kolejk dwustronn (ang. deque, double-ended queue),
dlatego posiada funkcj ktre bardzo szybko dodaj lub usuwaj elementy sekwencji na jej
pocztku lub koocu. W przypadku dziaao na elementach wewntrz sekwencji, funkcj je
wykonywujce dziaaj dod wolno, gdy s to operacje o duej zoonoci obliczeniowej.
typedef struct CvSeq {
int flags;
int header_size;
struct CvSeq* h_prev;
struct CvSeq* h_next;
struct CvSeq* v_prev;
struct CvSeq* v_next;
int total;
int elem_size;
char* block_max;
char* ptr;
int delta_elems;
CvMemStorage* storage;
CvSeqBlock* free_blocks;
CvSeqBlock* first;
}

19

Najwaniejszymi parametrami tej struktury s:

flags flaga okrelajca rodzaj tworzonej sekwencji,

wskaniki h_prev, h_next, v_prev, v_next wskaniki te nie su do wskazywania


elementw wewntrz sekwencji, ale do czenia rnych sekwencji pomidzy sob w
bardziej zoone struktury takie jak listy, grafy czy drzewa,

total - liczba punktw lub obiektw w sekwencji,


header_size rozmiar nagwka sekwencji,
elem_size rozmiar pojedynczego elementu sekwencji,
*ptr wskanik na aktualne miejsce zapisu danych,
*storage wskanik na pocztek sekwencji, czyli jego miejsce w pamici,
*free_first wskanik na pierwszy nie zajty blok,
*first wskanik na pierwszy blok sekwencji.

Sekwencje moemy tworzyd za pomoc funkcji alokujcej:


CvSeq* cvCreateSeq(int seq_flags,
int header_size, int elem_size, CvMemStorage* storage),

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

Pomocnicze struktury danych

OpenCV zawiera kilka pomocniczych typw danych. Wykorzystywane s czsto do


okrelania parametrw funkcji:

CvPoint podstawowy struktura okrelajca wsprzdne punktu. Do ich

okrelania wykorzystuj sie funkcj cv point() gdy wsprzdne s liczbami


cakowitymi, oraz cvPoint2D32f(x,y) dla wsprzdnych bdcych liczbami
zmiennoprzecinkowymi. Dla punktw okrelanych w przestrzeni trjwymiarowej
wykorzystuje si funkcj cvPoint3D(x,y,z) np.:
CvPoint pt = cvPoint(0,0);

//cvPoint(int x, int y)

CvSize struktura okrelajca wymiary obiektu, posiada dwa argumenty


szeroko oraz wysoko. Parametry te okrelane s za pomoc funkcji cvSize()
np.:
CvSize size = cvSize(80,40);

//cvSize(int width, height)

Zmienna size typu CvSize przyjmuje parametry szerokod 80 pikseli, wysokod 40 pikseli.

CvRect struktura za pomoc, ktrej tworzy si prostokty, posiada cztery

argumenty, wsprzdn x, y lewego grnego rogu oraz wysokod i szerokod.


Parametry te okrelane s za pomoc funkcji cvRect() np.:
CvRect rect = cvRect(10,10,80,40);

//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,

CvScalar struktura ta pozwala przechowywad maksymalnie cztery wartoci typu

double. Jej parametrem jest wskanik do czteroelementowej tablicy elementw


typu double. Parametry te okrelane s za pomoc funkcji tworzcej cvScalar np.:
CvScalar skalar = cvScalar(1,2.1,3.1,4); //cvScalar(double val[4])

Zmienna skalar typu CvScalar jest skalarem o wartociach (1,2.1,3.1,4).

2.2

Praca z obrazami

2.2.1

Tworzenie, kopiowanie i usuwanie obrazw

Tworzenie obrazw odbywa si za pomoc jednej z najczciej uywanych funkcji


z biblioteki OpenCV, a mianowicie cvCreateImage(). Podczas wywoania tej funkcji zostaje
stworzony nagwek i przydzielona zostaje pamid na dane za pomoc wskanika *imageData:
IplImage* cvCreateImage( cvSize size, int depth, int channels),

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),

gdzie *img jest wskanikiem na kopiowany obraz.

2.2.2

Przestrzenie barw i ich konwersja

Przed omwieniem sposobw konwersji przestrzeni barw, zostan przedstawione


podstawowe jej rodzaje.
Podstawowy tryb koloru to skala szaroci (ang. grey scale). Zawiera 256 tonw koloru,
zaczynajc od 0 koloru czarnego, przez 254 odcienie szaroci i kooczc na 256 kolorze
czarnym. Zawiera 8-bitow gbie kolorw. Obrazy w trybie skali szaroci nazywane
s monochromatycznymi.

Rysunek 7 Przekrj tonw skali szaroci

rdo zdjcia: [W4]

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].

Rysunek 8 Model RGB przestrzeni kolorw.

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,

nasycenia koloru (ang. Saturation), bdcego promieniem koa barw podstawy


stoka,

mocy wiata biaego (ang. Value, znanej rwnie jako Brightness), bdcej
wysokoci stoka.

rdo obrazu: [W5]

23

Rysunek 9 Model HSV przestrzeni kolorw.

rodek podstawy (koa) odpowiada kolorowi biaemu, wierzchoek za kolorowi czarnemu.


Barwy pomidzy tymi punktami stanowi tonacje przejcia pomidzy kolorem biaym
i czarnym. Centrum barwy czerwonej odpowiada wartod kta 0 lub 360 stopni, zielonej kt
120 stopni, niebieskiej za 240 skadowej Hue.
Istnieje jeszcze wiele innych modeli kolorw takie jak: YCrCb, XYZ, Lab, Luv, HLS, Bayer.
Kady z nich jest obsugiwane przez OpenCV.
Konwersja przestrzeni kolorw zostanie opisana w oparciu o podstawowe jej rodzaje, czyli:
RGB->Grey (Grey->RGB) oraz RGB->HSV.
Pierwsza z konwersji jest stosunkowo prosta w implementacji. Wartod piksela
przekonwertowanego z RGB do skali szaroci obliczany jest na podstawie nastpujcej
operacji:

W OpenCV do konwersji kolorw wykorzystywana jest funkcja cvCvtColor():


void cvCvtColor( const CvArr* src, const Arr* dst, int code);

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:
(
(

rdo obrazu: *W6+

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

Tworzenie interfejsu uytkownika

Funkcje OpenCV, ktre pozwalaj na wspdziaanie z systemem operacyjnym, systemem


plikw, czy elementami sprztowymi takimi jak kamera, s zebrane w bibliotece HighGUI
(High-Level Graphical User Interface). Biblioteka ta pozwala na tworzenie okien, oraz
wywietlanie na nich obrazw, wczytanych dziki moliwociom HighGUI w zakresie obsugi
plikw graficznych (obrazw i sekwencji wideo). Wspomaga rwnie obsug myszy, ktr
mona wykorzystywad do obsugi przecznikw oraz suwakw.
Tworzenie interfejsu uytkownika moemy podzielid na trzy czci: sprztow, obsugi
plikw oraz interfejsu uytkownika.
Pierwsz z nich jest komunikacja z urzdzeniami takimi jak kamera. Biblioteka HighGUI
dostarcza narzdzi, ktre w prosty sposb pozwalaj na komunikacj z kamer, co zazwyczaj
byo zmor programistw wykorzystujcych obrazy z kamery.
Drug czd stanowi obsuga plikw graficznych. Skupia si ona gwnie na zaadowaniu
oraz zapisaniu obrazw. Udostpnione narzdzia pozwalaj na prac zarwno z obrazami jak
i sekwencjami wideo. Wykorzystywane funkcje wspieraj wiele formatw graficznych wraz
z ich kodowaniem i dekodowaniem, gdy tego wymagaj.
Ostatnia czd skupia si na waciwym interfejsie uytkownika (GUI). Wbudowane funkcj
pozwalaj na otwieranie zdjd w stworzonych przez nie oknach. Uatwiaj modyfikacj
parametrw obrazw za pomoc funkcji tworzcych suwaki, przeczniki oraz wspomagajcych
obsug myszy.
W poniszych podrozdziaach zostan opisane operacje, ktre pozwalaj na stworzenie
rozbudowanego interfejsu uytkownika.

2.3.1

Obsuga okien

Podstaw interfejsu uytkownika s okna, ktre tworzone s za pomoc funkcji


cvNamedWindow(). Parametrami tej funkcji s: wymagana, unikatowa nazwa, ktra wywietlana
25

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
);

W momencie gdy nie potrzebujemy ju okna to zamykamy je uywajc funkcji


cvDestroyWindow(). Parametrem tej funkcji jest nazwa okna, ktre zostao wczeniej
stworzone:
void cvDestroyWindow (const char* name);

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);

Mona rwnie zmienid pooenie okna funkcj cvMoveWindow(), ktrej parametrami


s standardowo nazwa okna oraz wsprzdne lewego i grnego rogu okna wyraone
w pikselach:
void cvMoveWindow (const char* name, int x, int y);

2.3.2

Wczytywanie, wywietlanie i zapisywanie obrazw.

Przed wywietleniem obrazu w oknie, naley zapoznad si ze sposobem wczytania zdjcia


z pliku. Za ten proces odpowiedzialna jest funkcja cvLoadImage():
IplImage* cvLoadImage (const char* filename, int iscolor = 1),

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

od iloci kanaw zapisanych w pliku.


Funkcja zwraca w wyniku wskanik na zaalokowany obraz. Jeeli plik nie istnieje funkcja
zwraca pusty wskanik (NULL). W chwili obecnej biblioteka OpenCV wspiera nastpujce
formaty plikw: bitmapy BMP, DIB, pliki JPEG JPEG, JPG, JPE, pliki PNG, PBM, PGM, PPM, SR,
RAS, TIFF oraz TIF. Jeeli chcemy zaadowad plik o innym formacie, naley wczeniej
26

w programie graficznym przeprowadzid konwersj do formatu obsugiwanego lub uyd funkcji


cvCvtColor().
W momencie gdy plik zosta wczytany i przetworzony, mona go zapisad uywajc funkcji
cvSaveImage(). Zapisywany obraz musi mied format jednokanaowy 8-bitowy lub trzykanaowy
w przestrzeni RGB, z zachowaniem kolejnoci kolorw niebieski (B), zielony (G), czerwony (R).
Funkcja ma nastpujc struktur:
int cvSaveImage( const char* filename, const CvArr* image ),

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

Odczytywanie i zapisywanie danych z kamery oraz plikw wideo

Pierwsza czd tego podrozdziau zostanie powicona obsudze plikw wideo, druga za
funkcjom, ktre pozwalaj na gromadzenie danych z kamery podczonej do komputera.
adowanie

plikw wideo do OpenCV odbywa si za pomoc funkcji


cvCreateFileCapture(), ktrej parametrem jest interesujcy programist plik AVI lub MPG.
Funkcja ta ma za zadanie zaadowanie pliku i jego przygotowanie do odczytu. Poniej
deklaracja funkcji:
CvCapture* cvCreateFileCapture( cons char* filename);

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

bardzo szybka. Nastpnie korzystajc z funkcji cvRetrieveFrame() ramka jest przetwarzana


i zapisywana do rwnie niedostpnego wewntrznego bufora pamici. Funkcja zwraca
wskanik na IplImage wskazujcy ten obraz. Naley pamitad, e ta przetworzona ramka
zostanie zastpiona nastpn przy kolejnym wywoaniu funkcji cvGrabFrame(), dlatego jeeli
chce si korzystad z konkretnie tej ramki naley j wczeniej skopiowad w inne miejsce. Poniej
przedstawione s deklaracje opisanych funkcji:
int cvGrabFrame (CvCapture* capture);
IplImage* cvRetrieveFrame (CvCapture* capture);

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);

Przechwytywanie obrazw z kamery jest niezbdne w programach, ktre maj dziaad


w trybie rzeczywistym i na bieco maj analizowad zachodzce zmiany na interesujcym je
obszarze. Proces ten odbywa si za pomoc funkcji cvCreateCameraCapture():
CvCapture *capture = cvCreateCameraCaputure (int index),

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 );

Powyej zostay opisane sposoby odczytywania i przetwarzania obrazw. Ostatnia czd


tego podrozdziau bdzie opisywad sposb w jaki zapisuje si pliki wideo. Podstawow rzecz
jest stworzenie video writera jest to obiekt, ktry przechowuje wszystkie niezbdne
parametry do zapisu sekwencji wideo:
CvVideoWriter* cvCreateVideoWriter(
const char* filename,

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):

CV_CAP_PROP_POS_MSEC (0) pozycja w sekwencji wyraona w milisekundach,


CV_CAP_PROP_POS_FRAME (1) pozycja w sekwencji wyraona w klatach,
CV_CAP_PROP_POS_AVI_RATIO

(2) pozycja w sekwencji znormalizowana na

przedziale od 0 do 1,

CV_CAP_PROP_FRAME_WIDTH (3) szerokod (rozdzielczod) sekwencji,


CV_CAP_PROP_FRAME_HEIGHT (4) wysokod (rozdzielczod) sekwencji,
CV_CAP_PROP_FPS (5) ilod klatek na 1 sekund czasu,
CV_CAP_PROP_FOURCC (6) rodzaj kodeka zastosowanego do kompresji sekwencji,
CV_CAP_PROP_FRAME_COUNT

(7)

ograniczona ilod klatek w sekwencji.

Ostatni parametr value jest wartoci ustawian przez parametr property_id.


29

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)

Powyszych wartoci nie trzeba tumaczyd, s to wszystkie ewentualnoci akcji ze strony


myszy. Dwm nastpnym parametrom x i y zostan przypisane wsprzdne piksela, w ktrym
doszo do zdarzenia. Naley pamitad, e s to wsprzdne obrazu a nie okna, w ktrym ten
obraz si znajduje jak pisz wiele z zachodnich ksiek o tematyce OpenCV.
Czwarty parametr jest flag, ktra dostarcza informacji o przycisku, ktry zosta wcinity,
czy by to lewy klawisz myszy, prawy, rodkowy lub klawisz z klawiatury Ctrl, Shift lub Alt:

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)

Ostatni parametr jest przekazywany do funkcji podczas wywoania funkcji rejestrujcej


cvSetMouseCallback(), ktra zostanie opisana poniej. Parametr ten pozwala
na wykorzystanie funkcji obsugi zdarzeo dla wielu obrazw. Wystarczy tylko wczeniej
zrzutowad wskanik typu void na wskanik na typ IplImage.
Gdy funkcja obsugi zdarzeo jest kompletna naley j zarejestrowad, aby moga
przechwycid zdarzenie. Odpowiedzialna za to jest powyej wspomniana funkcja
cvSetMouseCallback():
void cvSetMouseCallback (
const char* window_name,
CvMouseCallback on_mouse,
void* param = NULL),

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.

Rysunek 10 Przykady zastosowania obsugi myszy w HighGUI

Obsuga klawiatury sprowadza si do wywoania funkcji cvWaitKey(). Jest to funkcja, ktr


czsto umieszcza si wewntrz ptli while. Taki ukad wykorzystuje si do zamknicia
programu za pomoc zadeklarowanego klawisza. Poniej pokazany jest najprostszy sposb
implementacji takiego ukadu:
while (1) {
if (cvWaitKey(10) == q)
break;
}

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

Dodawanie i wykorzystywanie suwakw

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);

Pierwszy parametr trackbar_name jest ju wczeniej wspomnian nazw suwaka, window_name


jest nazw okna, w ktrym si znajduje (suwak zazwyczaj umieszczany jest
na grze okna). Nastpny parametr value jest automatycznie ustawiany w zalenoci od
pozycji, w ktrej znajduje si suwak, count jest maksymalnym zakresem suwaka. Ostatni
parametr jest funkcj obsugi zdarzenia, ktra zostaje wywoywana przy kadym jego
przesuniciu. Suwak nie musi mied wczonej obsugi zdarzeo, wystarczy ustawid wartod
parametru na NULL, wwczas jedynym efektem dziaania suwaka bdzie zmiana wartoci
value.
Naley wspomnied jeszcze o dwch przydatnych funkcjach zwizanych z obsug suwakw.
Pierwsza z nich cvGetTrackbarPos() suy do odczytywania wartoci z suwaka. Wartoci
z suwaka mog byd uywane np. do zmiany parametrw obrazu. Poniej umieszczona zostaje
definicja tej funkcji (jej parametrw nie trzeba tumaczyd):
cvGetTrackBarPos(
const char* trackbar_name,
const char* window_name);

Druga funkcja cvSetTrackbarPos() zmienia pooenie suwaka, a dokadnie jego wartod.


Jej definicja wyglda nastpujco:
cvSetTrackBarPos(
const char* trackbar_name,
const char* window_name,
int pos);

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.

Rysunek 11 Przykad zastosowania suwakw jako przyciskw

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

Operacje na macierzach i obrazach

2.4.1

Dostp do pikseli obrazw

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().

W przypadku kiedy mamy do czynienia z obrazami monochromatycznymi


i jednokanaowymi wykorzystujemy funkcje cvGetReal2D() i cvSetReal2D(). Pierwsza z nich
pobiera dane z piksela I zwraca je w postaci liczby double:
double cvGetReal2D(const CvArr** arr, int x0, int x1);

gdzie arr wskazany obraz, ktrego elementom nadajemy wartoci, x0 to wsprzdna y,


a x1 wsprzdna x obrazu.

33

Druga funkcja suy do zapisywania danych do piksela obrazu:


void cvGetReal2D(const CvArr** arr, int x0, int x1, double val);

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);,

Trjka (r,g,b) to liczby cakowite.


Dostp poredni do piksela obrazu jest sposobem mao wydajnym, dlatego najczciej
stosuje si dostp bezporedni, ktry realizowany jest za pomoc wskanikw. Problem ten
zostanie opisany w oparciu o przykad, gdy ten sposb najatwiej bdzie mona zrozumied
zasad jego dziaania:
double grey =0;
int r,g,b=0;
CvScalar pix_val = CV_RGB(b, g, r);
int height = img->height;
int width = img->width;
int step = img->widthStep/sizeof(uchar);
int channels = img->nChannels;
uchar* data = (uchar *)img->imageData;
// dla obrazu wielokanaowego
b= data [y*step + x*channels + 0]
g= data [y*step + x*channels + 1]
r= data [y*step + x*channels + 2]
// dla obrazu jednokanalowego
grey = data [y*step + x]

Dostp do elementw obrazu uzyskany zosta za pomoc wskanika *imageData, zawartego w


strukturze IplImage. Dane w nim przechowywane s jako typ char, dlatego naleao wykonad
rzutowanie na inny typ (w tym przypadku na typ uchar w celu uniknicia problemw ze
znakami). Dugod linii obrazu jest okrelana przez parametr step (wyraony
w bajtach). Parametry x jest numerem kolumny obrazu, a y numerem wiersza.

2.4.2

Dostp do fragmentw obrazu

Dostp do fragmentw obrazu odbywa si dziki funkcji cvGetSubRect():


CvSize cvGetSubRect(const CvArr* arr,CvArr* submat,CvRect rect);

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

Obszar ROI i COI

Obszar ROI zosta zaimplementowany w celu zwikszenia wydajnoci i szybkoci dziaania


programw. Pozwala on na ograniczenie przetwarzania wycznie do prostoktnego fragmentu
obrazu.
Funkcj odpowiedzialn za okrelanie prostoktnego obszaru jest cvSetImageROI():
void cvSetImageROI (IplImage** image, CvRect rect);,

gdzie image jest obrazem wyjciowym, rect zdefiniowanym prostoktnym obszarem.


Funkcja usuwajc obszar ROI jest cvResetImageROI():
void cvResetImageROI (IplImage** image);,

ktrej jedynym parametrem jest obszar, na ktrym ROI si znajdowa.


W celu odnalezienia poloenia ROI na obrazie mona posuyd si funkcj cvGetImageROI():
CvRect cvGetImageROI (const IplImage* image);,

ktra zwraca obiekt typu CvRect z informacj o pooeniu i rozmiaru ROI.


Drugi z obszarw COI jest zdecydowanie rzadziej uywanym narzdziem. Pozwala on na
wyodrbnienie interesujcego nas kanau kolorw, ktry ma zostad poddany przetwarzaniu.
Do pracy z COI wykorzystywane s analogicznie do ROI funkcje cvSetImageCOI(),
cvResetImageCOI(), cvGetImageCOI().
W celu lepszego zrozumienia zagadnienia regionu zainteresowania napisany zosta
program, ktry na prostym przykadzie pokazuje jeden ze sposobw wykorzystania ROI.

Rysunek 12 Przykad zastosowania ROI na obrazie.

35

Na powyszym zrzucie ekranu pokazane zostao dziaanie programu. Na obrazie gwnym


zostaje zaznaczony obszar ROI. Drugi obraz, ktry widnieje w prawym dolnym rogu, zosta
wycity z obrazu gwnego objtego ROI i przekonwertowany z formatu RGB na skal szaroci.

2.4.4

Operacje macierzowe

Biblioteka OpenCV dostarcza wiele funkcji odpowiedzialnych za operacje na macierzach,


ktre wykorzystywane s do przetwarzania obrazw. W tym podrozdziale zostan opisane
tylko te, ktre s najczciej uywane lub zostay wykorzystane w moich projektach.
Pierwsz grup stanowi funkcj obliczajce wartoci bezwzgldne:

cvAbs () oblicza wartod bezwzgldna z macierzy,

cvAbsDiff() oblicza wartod bezwzgldna z rnicy dwch macierzy,

cvAbsDiffS() oblicza wartod bezwzgldna z rnicy macierzy i skalara.

Nastpnie grup stanowi funkcj dodajce:

cvAdd()- dodaje do siebie dwie macierze,


cvAddS() dodaje do siebie macierz i skalar,

Pozostae funkcj zostan opisane w postaci wyliczenia:

cvAvg() - oblicza redni wartod ze wszystkich elementw macierzy,


cvConvertScale() pozwala zmienid gbi pikseli obrazu np. z 8 bitowego obrazu

RGB na 16 bitowy lub przeprowadzid liniow transformacj w oparciu o parametry


scale i Shift,
cvCopy() kopiuje elementy z jednej macierzy do drugiej,
cvCvtColor() zostaa opisana w podrozdziale 2.2.2,
cvDet() oblicza wyznacznik macierzy kwadratowej,
cvDiv() wykonuje dzielenie macierzy jednej przez drug,
cvGetSubRect() zostaa opisana w podrozdziale 2.4.2,
cvInRange() sprawdza, ktre elementy macierzy znajduj si w zdefiniowanym
wczeniej przedziale. W wynikowej macierzy elementy z zakresu maj wartod
maksymalna, za elementy z poza zakresu wartod 0,
cvInRange() podobnie jak cvInRange(), tylko porwnywane s elementy
macierzy ze skalarem,
cvMax() przy porwnaniu odpowiadajcych sobie elementw z dwch macierzy,
do macierzy wynikowej zostaje wpisany piksel o wikszej wartoci,
cvMin() podobnie jak cvMax(), tylko do macierzy wynikowej zostaje wpisany
piksel o mniejszej wartoci,
cvMinMaxLoc() znajduj wartod minimaln i maksymaln pikseli macierzy,
zwraca ich wsprzdne i zapisuje ich wartoci do zmiennych,

36

cvNorm() wyznacza norm z jednej lub dwch macierzy. Wszystkie dopuszczalne

normy opisane s w dokumentacji biblioteki,


cvSplit() pozwala na rozdzielenie macierzy z pikselami wielokanaowymi (o 3
lub 4 wartociach), na macierze o pikselach jednokanaowych (o jednej wartoci),
cvZero() ustawia wszystkie wartoci elementw macierzy na 0.

Dokadna specyfikacja przedstawionych funkcji opisana jest w podrczniku uytkownika


biblioteki OpenCV.

2.4.5

Rysowanie ksztatw

Podczas pracy z obrazami czsto wystpuje potrzeba narysowania na nim pewnego


obiektu. Biblioteka OpenCV dostarcza narzdzia niezbdne do narysowania linii, kwadratw,
okrgw, elips i wieloksztatw. Pozwala rwnie na umieszczanie znakw tekstowych
na obrazach.
OpenCV zawiera trzy algorytmy do rysowania linii. Dwa z nich to algorytmy Bresenhama
a trzeci jest algorytmem antyaliasingowym, wykorzystujcym filtr Gaussa [3]. Funkcja rysujca
lini to cvLine():
void

cvLine(

IplImage*

img,

CvPoint

pt1,

CvPoint

pt2,

int

color,

int

thickness, int connectivity = 8 );,

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 );

gdzie center jest punktem rodka okrgu, a radius jego promieniem.


Funkcja cvEllipse() rysuj elipsy:

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:

Rysunek 13 Sposb rysowania Elipsy w HighGUI

Ostatnia grupa funkcji dotyczy rysowania wielobokw. Odpowiedzialne za nie s trzy


funkcje, ktre rni si sposobem wyznaczania punktw:
void cvFillPoly( IplImage* img, CvPoint** pts, int* npts, int contours,int
color );
void cvFillConvexPoly( IplImage* img, CvPoint* pts, int npts, int color );
void cvPolyLine( IplImage* img, CvPoint** pts, int* npts, int contours,
isClosed, int color, int thickness=1 );

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.

rdo obrazu (modyfikacja wasna): *W7+

38

2.4.6

Wstawianie tekstu

Jak ju zostao wspomniane OpenCV pozwala na umieszczanie tekstu na obrazach.


Ograniczeniem naoonym przez twrcw biblioteki jest ilod czcionek. Przed dodaniem napisu
do obrazu naley najpierw zainicjowad czcionk, ktr litery bd pisane. Tworzy si najpierw
obiekty typu CvFont funkcj cvFont(), a nastpnie za pomoc cvInitFont() aduj si
konkretn czcionk:
cvInitFont( CvFont* font, int font_face, double hscale, double vscale, double
shear =0, int thickness = 1, int line_type = 8);

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

Progowanie jest jedn z najprostszych metod wydzielania obszarw (segmentacji),


speniajcych pewne kryterium jednorodnoci [4]. Operacja ta realizowana jest na zasadzie
porwnywania kadego piksela obrazu z zadanym progiem (ang. threshold) i przypisaniem mu
odpowiedniej wartoci. W bibliotece OpenCV zaimplementowanych jest kilka rodzajw
progowania:

progowanie binarne (CV_THRESH_BINARY),


odwrcone progowanie binarne (CV_THRESH_BINARY_INV),
okrawajce (CV_THRESH_TRUNC),
progowanie do zera proste (CV_THRESH_ZERO),
progowanie do zera odwrotne (CV_THRESH_ZERO_INV).

Operacja progowania wykonywana jest za pomoc funkcji cvThreshold():


double cvThreshold(const CvArr* src,CvArr* dst,
double threshold,
double maxValue,
int thresholdType );

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:
(

gdzie x i y s wsprzdnymi piksela obrazu wyjciowego dst i rdowego src.


W przypadku odwrconego progowania binarnego piksel o wartoci wikszej od progu ma
przypisywan wartod 0, za w przeciwnym wypadku wartod maxValue:
(

W progowaniu okrawajcym piksel o wartoci wikszej od progu ma przypisywan wartod


tego progu, w przeciwnym wypadku jego wartod nie jest zmieniana.
(

40

(
(

Progowanie do zera proste zakada, e do piksela o wartoci mniejszej od ustalonego progu


przypisywana jest wartod 0, w przeciwnym wypadku wartod nie jest zmieniana.
(

Funkcja ostatniego omawianego progowania do zera odwrotnego, przypisuje pikselowi o


wartoci powyej progu wartod 0 lub w przeciwnym wypadku nie zostaje zmieniana.
(

(
(

Przykady realizacji omawianych rodzajw progowa przedstawiaj ponisze rysunki.

Rysunek 14 Progowanie binarne, binarne odwrcone, proste, proste odwrcone, okrawajce

Biblioteka dodatkowo dostarcza bardzo pomocn zmodyfikowan wersj progowania, tzw.


progowanie adaptacyjne, w ktrym wartod progu jest jedn ze zmiennych. Algorytm ten jest
realizowany funkcj cvAdaptiveThreshold():
41

void cvAdaptiveThreshold(CvArr* src, CvArr* dst,


double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 = 5
);

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.

Rysunek 15 Przykad dziaania progowania adaptacyjnego.

Jak widad na powyszym porwnaniu. Zdecydowanie lepszy wynik dao zastosowanie


progowania adaptacyjnego. W obu przypadkach algorytmem progowania by
CV_THRESH_BINARY. Progowanie adaptacyjne wywoane zostao progowaniem algorytmem
uredniajcym CV_ADAPTIVE_THRESH_MEAN_C. Zastosowanie algorytmu z rozkadem Gaussa
dao niewiele gorszy efekt od algorytmu uredniajcego.

42

3.2

Przeksztacenia kontekstowe i konwolucja

Operacje kontekstowe s przeksztaceniami, ktre dla wyznaczenia wartoci jednego


piksela obrazu wynikowego dokonuj obliczeo na wielu pikselach obrazu rdowego. Polega
to na wyznaczeniu wartoci funkcji (filtru), ktrej argumentami s wartoci piksela o tym
samym pooeniu na obrazie rdowym oraz wartoci pikseli z jego otoczenia (obszaru
maski)[17]. Operacje te pozwalaj wydobyd z obrazu wiele informacji, umoliwiaj m.in.
usuwanie lub ograniczanie poziomu zakceo naoonych na obraz (redukcja szumu),
wygadzaj chropowate krawdzie, rozmywaj i wygadzaj obraz, ujawniajc szczegy
obiektw itp.[4]
Przeksztacenia kontekstowe realizowane s za pomoc konwolucji (splotu funkcji) obrazu
rdowego z mask filtru. Maska splotu jest macierz elementw zwanych wspczynnikami
maski, definiuje ona otoczenie analizowanego piksela. Zazwyczaj ma ona ksztat kwadratu,
z punktem centralnym (ang. anachor point) zazwyczaj znajdujcym si w jej rodku.

punkt
centralny

Rysunek 16 Maska splotu o rozmiarze 3 x 3.

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 ( ) jest obrazem rdowym, (


punkcie (
).

) mask filtra oraz punkt centralny znajduje si w

W OpenCV operacj t wykonuje funkcja cvFilter2D():


void cvFilter2D(
const CvArr* src,
CvArr* dst,
const CvMat* kernel,
CvPoint anchor = cvPoint(-1,-1)
);

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

Istotnym problemem podczas wykonywania operacji kontekstowych (filtracji) s piksele


brzegowe obrazu. Maska naoona na analizowany brzegowy piksel nie zawiera penej iloci
potrzebnych punktw do obliczenia jego nowej wartoci. Funkcja cvFilter2D() radzi sobie
z tym problemem. Jednak w momencie gdy programista chce stworzyd wasny algorytm
obliczania splotu funkcji, musi sam rozwizad ten problem. Biblioteka zawiera funkcj
cvCopyMakeBorder(), ktra kopiuje obraz rdowy do wntrza innego obrazu, ktrego
wysokod oraz szerokod jest powikszona o (N-1)/2 pikseli (przy zaoeniu, e maska ma
rozmiar N x N).

3.3

Filtry do detekcji krawdzi

Detekcja krawdzi polega na takiej modyfikacji obrazu, aby pokazad krawdzie


wystpujcych na nim obiektw. Detekcja krawdzi odbywa si za pomoc obliczenia
pierwszej i drugiej pochodnej funkcji opisujcej zmiany jasnoci pikseli na obrazie.
Na obrazie dyskretnym wyznaczanie pierwszej pochodnej polega na policzeniu
dyskretnego operatora gradientu, za drugiej pochodnej na policzeniu kierunku zmiany
operatora gradientu.
Filtry krawdziowe oparte o pierwsz pochodn daj najlepsze rezultaty dla obrazw,
na ktrych obiekty charakteryzuj si du rnic poziomu jasnoci pikseli w stosunku do ta,
natomiast dla obrazw, na ktrych granica pomidzy jasnoci pikseli obiektw i ta jest
bardziej rozmyta stosuje si metod opart o drug pochodn.
Naley pamitad, e stosowanie filtrw krawdziowych powoduje wyostrzenie maych
detali oraz powstaniu szumw impulsowych, co skutkuje pogorszeniem jakoci obrazu oraz
bdn detekcj nieistniejcych brzegw.
W rozdziale tym opisane zostay nastpujce filtry do detekcji krawdzi wykorzystujce
operatory Robertsa, Sobela ,Laplacea, Cannyego.

44

Rysunek 17 Obliczanie pierwszej i drugiej pochodnej obszarw o zmiennej jasnoci [5]

Operatory gradientw po zadanych wsprzdnych dla obrazu (

po wsprzdnej x :

po wsprzdnej y :

):

W obrazach skadajcych si z macierzy pikseli gradienty dyskretne wyznaczane s


na podstawie rnicy wartoci dwch ssiednich pikseli. Podstawowymi operatorami
wykorzystywanymi do tego celu s operatory Robertsa:
0

-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:

). Parametr xorder jest rzdem pochodnej

w kierunku x, yorder w kierunku y, aparture_size rozmiarem maski Sobela. Wersja 2.1


OpenCV pozwala na uywanie rozmiarw 1x1, 3x3, 5x5, 7x7. Standardowo funkcja ta jest
wywoywana z parametrami:
xorder = 1, yorder = 0, aparture_size = 3, wwczas maska ma postad:
-1

-2

-1

xorder = 1, yorder = 0, aparture_size = 3, wwczas maska ma postad:


1

-1

-2

-1

Operator Sobela dziki poczeniu waciwoci Gaussowskiego rozmycia oraz


rniczkowania jest dod odporny na zakcenia na obrazie w momencie gdy rozmiar maski jest
odpowiednio duy. W przypadku zastosowywania maski 3x3 do wykrycia krawdzi pionowych
lub poziomych operator Sobela radzi sobie dostatecznie dobrze.
Jeeli potrzebna jest wiksza dokadnod przy zachowaniu tej samej zoonoci
obliczeniowej mona wykorzystad specjaln wartod parametru aparture_size funkcji
cvSobel(), czyli CV_SCHARR ( numerycznie -1). Jest to filtr o masce 3x3, ktry radzi sobie
lepiej ni filtr Sobela o tych samych rozmiarach maski. Maski operatora Scharra maj
nastpujc postad:

-3

10

-10

10

-3

-3

-10

-3

46

Poniej przedstawione s efekty dziaania filtru Sobela z rnymi parametrami:

a)

b)

c)

d)

e)

f)
Rysunek 18 Zastosowanie rnych operatorw kierunkowych Sobela dla obrazu w skali szaroci

Powysze rysunki odpowiadaj kolejno: a obraz oryginalny, b obraz w skali szaroci, c


maska Sobela XY, d maska Sobela XY 5x5, c maska Sobela X, - d maska Scharra X,
e maska Sobela f, h maska Scharra Y. Z obserwacji wynika, e Sobel jest typowym filtrem
kierunkowym. Krawdzie wykrywane s w paszczyznach odpowiadajcym wykorzystanym
operatorom kierunkowym. Widad rwnie, e zastosowanie maski Scharra, ktra przez
wiksze wspczynniki maski zwikszya istotnod pikseli ssiednich w obliczaniu punktu
centralnego i dziki temu krawdzie s bardziej wyeksponowane.
Krawdzie mog byd wykrywane w penym otoczeniu punktu obrazu za pomoc operatora
kombinowanego
obliczanego
na
podstawie
amplitudy
gradientu,
obliczanej
z pionowego i poziomego gradientu zgodnie z formua Euklidesow: | |
47

. Stosuje

si j, aby uniknd kompensacji pikseli dodatnich i ujemnych powstaych przy zastosowaniu


filtrw kierunkowych pionowych i poziomych. Operacja ta przy obliczeniach komputerowych
aproksymowana jest do uproszczonej formy: | | | | | |. Dla maski zdefiniowanej
w poniszy sposb:
M1

M2

M3

M4

M5

M6

M7

M8

M9

amplituda gradientu obliczana jest ze wzoru


| |

|(

)|

|(

)|

Efekt dziaania filtru Sobela z wykorzystaniem operatora kombinowanego:

Rysunek 19 Zastosowanie operatora kombinowanego 3x3 i 5x5 dla filtru Sobela

Powyszy rysunek potwierdza fakt, i zastosowanie wikszej maski powoduje widoczniejsza


detekcj krawdzi.

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);

Funkcja oblicza laplasjan obrazu wyjciowego na podstawie wzoru:


(

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.

Rysunek 20 Zastosowanie filtru Laplace'a do wykrywania krawdzi

Jak mona zauwayd na rysunkach filtr Laplacea wykrywa krawdzie w kadej paszczynie. S
one wyraziste i uwypuklone.

3.3.3

Filtr Cannygo

Najbardziej rozbudowany jest filtr Cannyego. Oparty jest o wielostopniowy algorytm


speniajcy nastpujce kryteria:

powinien rozpoznawad moliwie du ilod krawdzi,


odlegod pomidzy znalezion krawdzi, a krawdzi rzeczywist powinna
byd minimalna,
znaleziona krawd powinna byd wykryta tylko raz.

Algorytm speniajcy te wymogi najpierw wykorzystuje filtr Gaussa w celu redukcji


ewentualnych zakceo na obrazie. Nastpnie uywa filtru Sobela z operatorami znajdujcymi
krawdzie pod czterema ktami 0, 45, 90 i 135 stopni. Na podstawie tego znajdowane s
gradienty (z lokalnymi maksimami), ktre staj si kandydatami do bycia czci krawdzi.
Badane s ssiednie piksele kandydatw w przestrzeni prostopadej do kierunku ich gradientu.
Jeeli wartod piksela kandydata ma mniejsz intensywnod od ktrego z ssiadw to jest on
eliminowany. Koocowa faza algorytmu polega na zastosowaniu progowania histerezowego.
49

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.

Rysunek 21 Zastosowanie filtru Canny'ego do detekcji krawdzi

Powyej zosta zrealizowany filtr Cannyego z parametrami threshold1 = 40 oraz


threshold2 = 120, przy standardowej masce 3x3. Efekt bardzo zadowalajcy na obrazie
binarnym widoczne s praktycznie wszystkie poszukiwane krawdzie.

50

3.4

Kontury

3.4.1

Kontury i ich interpretacja

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().

Rysunek 22 Zasada 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:

CV_RETR_EXTERNAL zwraca tylko najbardziej zewntrzny kontur obrazu:

firstContour = c0,

CV_RETR_LIST zwraca wszystkie znalezione kontury poczone w list cznikami


h_prev i h_next:

CV_RETR_CCOMP zwraca wszystkie kontury w dwupoziomowej strukturze, gdzie

wyszy poziom stanowi kontury najbardziej zewntrzne a niszy stanowi


dziury, poczone z konturami zewntrznymi, w ktrych si zawieraj. czenie
konturw odbywa si za pomoc wszystkich moliwych cznikw:

CV_RETR_TREE zwraca wszystkie kontury i ukada je w hierarchiczne drzewo

zagniedonych konturw. Zgodnie ze wczeniejszym opisem pocztkiem drzewa


jest kontur c0 zawierajcy dwie dziury h00 i h01 na tym samym poziomie.
Nastpnie dziura h00 zawiera kontur c000 oraz dziura h01 zawiera kontur
c010, itd. Najbardziej zagniedone kontury znajduj si na samym dole drzewa:

52

Ostatni parametr method okrela sposb aproksymacji konturw. Przyjmuje nastpujce


wartoci:

CV_CHAIN_CODE wynikowe kontury zapisane s w postaci kodu aocuchowego

Freemana, pozostae metody opieraj si na wierzchokach wieloboku bdcego


konturem. Dokadny opis aocuchw Freemana znajduje si w rozdziale 3.6.2,
CV_CHAIN_APPROX_NONE wynikowe kontury s przetwarzanie z kodu Freemana
na punkty bdcych wierzchokami wieloboku,
CV_CHAIN_APPROX_SIMPLE wynikowe kontury s kompresowane poziomo, pionowo
oraz diagonalnie pozostawiajc jedynie koocowe punkty,
CV_CHAIN_APPROX_TC89_L1
lub CV_CHAIN_APPROX_TC89_KCOS inny rodzaj
aproksymacji aocucha konturw,
CV_LINKS_RUNS czy poziome segmenty. Metoda ta jest dostpna tylko
dla CV_RETR_LIST.

Naley pamitad, e funkcja domylnie przyjmuje parametr mode = CV_RETR_LIST


oraz method = CV_CHAIN_APPROX_SIMPLE.

3.4.2

Operacje na konturach

Kontury s sekwencjami punktw stanowicych pewien rodzaj krzywej na obrazie. OpenCV


dostarcza funkcje, ktre pozwalaj na przetwarzanie tych aocuchw punktw. Ich lista
znajduje si poniej:
CvContourScanner cvStartFindContours(
CvArr* image, CvMemStorage* storage,
int header_size = sizeof(CvContour),
int mode = CV_RETR_LIST, int method = CV_CHAIN_APPROX_SIMPLE,
CvPoint offset = cvPoint(0,0));
CvSeq* cvFindNextContour(CvContourScanner scanner);

53

void cvSubstituteContour(CvContourScanner scanner,


CvSeq* new_contour);
CvSeq* cvEndFindContour(CvContourScanner* scanner);

Funkcja cvStartFindContours() jest cile powizana z cvFindContours() z t rnic,


e wywoywana jest w momencie gdy analizowany jest pojedynczy kontur. Funkcja ta zwraca
obiekt scanner typu CvContourScanner zawierajcy informacj, o tym ktra czd sekwencji
konturw zostaa odnaleziona, a ktra nie. Nastpnie wywoanie funkcji
cvFindNextContour(),
ktrej
argumentem
jest
zwrcony
przez
funkcj
cvStartFindContours() scanner, pozwala na znalezienie wszystkich pozostaych konturw. W
momencie gdy zwrcona zostanie wartod NULL oznacza to, e wszystkie kontury obrazu
zostay odnalezione. Przeszukiwanie sekwencji mona zakooczyd funkcj cvEndFindContour()
i wwczas do wskanika scanner zostaje przypisana pozycja do pierwszego elementu
sekwencji.

3.4.3

Kod acuchowy Freemana

Zwykle kontury reprezentowane s za pomoc sekwencji wierzchokw wieloboku.


Alternatywn reprezentacj jest kodowanie za pomoc kodu aocuchowego Freemana, ktry
mona aktywowad przy wywoaniu funkcji cvFindContours() ustawiajc parametr method
na CV_CHAIN_CODE. W rezultacie kontury bd reprezentowane za pomoc sekwencji krokw
od pierwszego do smego kierunku, ktre s oznaczane liczbami cakowitymi od 0 do 7. Ten
rodzaj kodowania czsto wykorzystywany jest przy programach do rozpoznawania ksztatw
[6]. Do pracy z aocuchami Freemana OpenCV dostarcza dwie pomocnicze funkcje:
void cvStartReadChainPoints(
CvChain* chain,CvChainPtReader* reader);
CvPoint cvReadChainPoint( CvChainPtReader* reader);

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

CvChain* jest odmian sekwencji CvSeq*


mona interpretowad tak samo jak scanner w sekwencjach

54

pocztek
aocucha

0
Rysunek 23 Kod aocuchowy Freemana

Na rysunku po lewej stronie przedstawiony zosta sposb kodowania kierunkw


liczbami cakowitymi. Rysunek po prawej pokazuje powstay aocuch Freemana,
przetumaczony z konturw kierunkowych obiektu na obrazie.

3.4.4

Rysowanie konturw.

Rysowanie konturw odbywa si za pomoc funkcji cvDrawContours():


void cvDrawContours(
CvArr* img,CvSeq* contour, CvScalar external_color,
CvScalar hole_color, int max_level, int thickness = 1,
int line_type = 8, CvPoint offset = cvPoint(0,0) );

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 24 Obraz wejciowy przed wykryciem konturw.

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

Rozmycie (ang. smoothing) jest prost i czsto stosowan w przetwarzaniu obrazw


operacj. Ma wiele zastosowao jednak gwnie wykorzystywana jest do redukcji szumw
oraz niepodanych znieksztaceo obrazu. W OpenCV funkcj realizujc rozmycie jest
cvSmooth(). Za jej pomoc realizowane s nastpujce filtry: rozmywajcy prosty, prosty bez
skalowania, medianowy, gaussowski oraz bilateralny:
void cvSmooth(
const CvArr* src, CvArr* dst, int smoothtype = CV_GAUSSIAN,
int
param1=3,
int
param2=0,
double
param3=0,double

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

Obrazy zostay utworzone za pomoc programu demonstracyjnego contours.exe stanowicego czd


biblioteki OpenCV 2.1

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]:
(

Parametry funkcji cvSmooth() maj nastpujce odzwierciedlenie w powyszym wzorze:


param1 -> x, szerokod maski,
param2 - >y, wysokod maski,
param3 -> odchylenie standardowe.
W momencie gdy odchylenie standardowe
korzysta z zalenoci:
Przykadowo dla

nie jest zdefiniowane funkcja cvSmooth()

, lub

, maska aproksymujca dwuwymiarowy rozkad Gaussa ma postad:

Rysunek 26 Przykadowa maska filtru Gaussa

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

Rysunek 27 Zastosowanie filtru Gaussa dla jednowymiarowej macierzy pikseli [8]

W wersji warto zaznaczyd, e implementacja rozmycia Gaussowskiego w OpenCV, zawiera


wbudowane maski o standardowych rozmiarach 3x3, 5x5 oraz 7x7 ze standardowym
odchyleniem standardowym rwnym jeden, ktre daj bardzo dobre w sensie
optymalizacyjnym rozmycie Gaussowskie. Naley pamitad, e zwikszenie wartoci parametru
zmniejsza ilod zakceo wystpujcych na obrazie, ale zmniejsza te dokadnod wykrywania
krawdzi na obrazie. Operacje te mog byd wykonywane na obrazach jedno lub
trzykanaowych 8- lub 32-bitowych.
Zasad dziaania ostatniego filtru bilateralnego najatwiej jest przedstawid metod
porwnawcz z filtrem Gaussa. Efekt dziaania tego drugiego filtru oparty jest tylko o jedn
urednion wag, ktr jest odlegod euklidesowa. Filtr bilateralny jest jednym z filtrw
nie rozmywajcych krawdzi. Moliwe jest to dziki zastosowaniu drugiej wagi, ktr jest
nie odlegod, a rnica w intensywnoci pomidzy pikselem centralnym maski a jego
otoczeniem.
Poniej zamieszczone s obrazy poddane opisanym wyej metod filtracji:
a)

Rysunek 28 Zastosowanie rozmycia a - medianowego, b gaussowskiego

58

b)

3.6

Transformata Hougha

Wymienione w poprzednich podrozdziaach sposoby wykrywania krawdzi s dobrym


narzdziem w fazie pre-processingu, gdzie istot jest wykrycie pikseli, ktre prawdopodobnie
nale do krzywej bdcej krawdzi. W efekcie czsto nie wykrywa si wszystkich pikseli
nalecych do krawdzi oraz pojawiaj si piksele, ktre znajduj si tylko w okolicy krawdzi.
W momencie gdy wane jest znalezienie ksztatw opisywalnych rwnaniami takich jak linie
proste, okrgi czy elipsy naley skorzystad z moliwoci jakie daje Transformata Hougha.

3.6.1

Wykrywanie linii

Istnieje kilka algorytmw wykrywania linii za pomoc transformaty Hougha. Poniej


zostan opisane te, ktre s zaimplementowane w bibliotece OpenCV.
Klasyczna transformacja Hougha dla linii prostych (ang. standard Hough Transform STH)
zakada, e kady punkt obrazu moe byd reprezentowany za pomoc krzywej sinusoidalnej.

L2
L1

L3

L4

P0

Rysunek 29 Realizacja klasycznej transformaty Hougha.

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

rdo obrazu (wygenerowany z Apletu Java): *W8+

60

CvSeq* cvHoughLines2(CvArr* image,void* line_storage,


int method, double r, double theta, int threshold,
double param1 = 0,double param2 = 0 );

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:

CV_HOUGH_STANDARD, dla klasycznej transformaty Hougha,


CV_HOUGH_PROBABILISTIC, dla probabilistycznej transformaty Hougha,
CV_HOUGH_MULTI_SCALE, dla trzeciego algorytmu bdcego modyfikacj klasycznej

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).

Rysunek 31 Zasada wypeniania elementw akumulatora.

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

Okrg moe byd opisany za pomoc dwch rwnao parametrycznych:

Transformata Hougha do wykrywania okrgw (ang. Circle Hough Transform CHT)


potrzebuje wic trjk (x, y, theta). W tym wypadku akumulator musiaby byd tablic
trjwymiarow. Praca na takich tablicach pochania spor ilod mocy obliczeniowych
i czsto doprowadza do przekamao i bdw w obliczeniach. W takim wypadku, aby
sprowadzid tablic akumulatora do postaci dwuwymiarowej naley jeden z parametrw ustalid
jako stay.
Zakadajc, e szukane s okrgi o konkretnym promieniu R rwnania okrgu mona
zapisad w postaci:

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

Rysunek 32 Wykrywanie okrgw dla CHT przy znanym promieniu R.

rodek okrgu w przestrzeni (x, y) bdzie czci wspln wszystkich okrgw w


przestrzeni (a, b). Poniej przedstawione zostay poszczeglne etapy detekcji rodka okrgu na
obrazie wejciowym:

62

Rysunek 33 Programowa detekcja rodka okrgu dla CHT.

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

CvSeq* cvHoughCircles(CvArr* image,void* circle_storage,


int method,double dp,double min_dist,double param1 = 100,
double param2 = 300,
int min_radius = 0,
int max_radius = 0
);

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:

Rysunek 34 Detekcja okrgw na obrazie za pomoc CHT.

Okrgi zostay wykryte na podstawie poniszego kodu:


#include <highgui.h>
#include <cv.h>
#pragma comment(lib, "highgui210")
#pragma comment(lib, "cv210")
using namespace std;
int main()
{
//adowanie obrazu image oraz tworzenie obrazu gray
IplImage* image = cvLoadImage("C:\\okno2.jpg",1);
IplImage* gray = cvCreateImage(cvGetSize(image), 8, 1);

64

// alokowanie pamici dla sekwencji


CvMemStorage* storage = cvCreateMemStorage(0);
//tworzenie okien pod wynik operacji
cvNamedWindow("overview");
cvNamedWindow("cvHoughCircles");
//konwersja wejciowego obrazu kolorowego do 8 bitowego w skali szaroci
cvCvtColor(image, gray, CV_RGB2GRAY);
//zapisywanie sekwencji okrgw wykrytych przez CHT
CvSeq* results = cvHoughCircles(gray,storage,CV_HOUGH_GRADIENT,2,10,
40,120,9,17);
//ptla rysujca okrgi zapisane w sekwencjach za pomoc wsprzdnych
rodka okrgu oraz dugoci promienia
for( int i = 0; i < results->total; i++ )
{
float* p = (float*) cvGetSeqElem( results, i );
CvPoint pt = cvPoint( cvRound( p[0] ), cvRound( p[1] ) );
cvCircle(image,pt,cvRound( p[2] ),CV_RGB(255,0,0),3);
}
//otwieranie okien z wynikami operacji
cvShowImage( "cvHoughCircles", gray);
cvSaveImage("circless.jpg",image);
cvShowImage("overview", image);
//okna zamykane s dowolnie nacinitym klawiszem
cvWaitKey(0);
//usuwanie obiektw
if(image)
cvReleaseImage(&image);
if(gray)
cvReleaseImage(&gray);
return 0;
}

3.7

Przeksztacenia morfologiczne

OpenCV dostarcza szybkie algorytmy realizujce transformacje morfologiczne obrazw.


Przeksztacenia morfologiczne s to przeksztacenia, ktre powoduj, e dany piksel obrazu
jest modyfikowany tylko wtedy, gdy speniony jest zadany warunek logiczny [4]. Podstawowym
pojciem przy operacjach morfologicznych jest element strukturalny, bdcy wycinkiem
obrazu, ktry zawiera punkt centralny. Jego ksztat jest porwnywany z lokalna konfiguracj
badanego piksela i dopiero w momencie jej spasowania realizowana jest na pikselu okrelona
funkcja.
OpenCV daje moliwod tworzenia wasnego elementu strukturalnego bdcego typem
IplConvKernel. Konstruowane s za pomoc funkcji cvCreateStructuringElementEx()
oraz usuwane funkcj cvReleaseStructuringElement():
IplConvKernel* cvCreateStructuringElementEx(
int cols, int rows, int anchor_x, int anchor_y, int shape,
int* values=NULL);
void cvReleaseStructuringElement( IplConvKernel** element );

Elementy strukturalne (element), w przeciwieostwie do masek wykorzystywanych


przy splotach, nie potrzebuj adnych danych numerycznych. W momencie tworzenia
65

elementu parametry rows i cols okrelaj rozmiar prostokta, w ktrym si znajduje.


Wsprzdne anachor_x oraz anachor_y definiuj pozycj punktu centralnego, kolejny
parametr shape okrela ksztat elementu strukturalnego:
CV_SHAPE_RECT - prostoktny,
CV_SHAPE_CROSS krzyowy,
CV_SHAPE_ELLIPSE eliptyczny,
CV_SHAPE_CUSTOM moliwod stworzenia wasnego ksztatu.

Wskanik values do danych elementu strukturalnego, okrela ktre piksele z ssiedztwa s


brane pod uwag. Element strukturalny jest macierz, ktrej niezerowe wartoci definiuj
obszar ksztatu. Jeeli wskanik jest rwny NULL oznacza, to e wszystkie elementy s
niezerowe i wwczas element strukturalny ma ksztat prostokta.
Poniej zamieszczone zostay przykadowe ksztaty elementu strukturalnego:

Rysunek 37Element strukturalny


w ksztacie prostokta.

Rysunek 36 Element strukturalny


w ksztacie prostokta.

Rysunek 35 Element strukturalny w


ksztacie okrgu.

Podstawowymi przeksztaceniami morfologicznymi s dylatacja i erozja. Ponisze operacje


zostan opisane dla obrazw w skali szaroci. Czsto stosuje si je rwnie dla obrazw czarnobiaych, ktre zostay przetworzone za pomoc progowania. Idee dziaania algorytmw jest
taka sama, dlatego zostanie opisana dla oglniejszego przypadku.
Dylatacja polega na przesuwaniu punktu centralnego elementu strukturalnego
po brzegach obszaru. W tym czasie wybierana jest maksymalna wartod piksela
obejmowanego przez element strukturalny i przypisywana jest do wartoci piksela centralnego
(realizacja funkcji maksimum).

Rysunek 38 Dylatacja. Obliczanie wartoci piksela za pomoc elementu strukturalnego

Operacja ta powoduje, e elementy przetwarzanego obrazu czone s w obiekty, usuwane


s drobne wklsoci w wyrnionych obszarach oraz wygadzane s brzegi.
66

Rysunek 39 Wykonanie operacji dylatacji na obrazie

Erozja jest operacj odwrotn do dylatacji. Element strukturalny jest przesuwany


wewntrz obszaru. W tym czasie wybierana jest minimalna wartod piksela obejmowanego
przez element strukturalny i przypisywana jest do wartoci piksela centralnego (realizacja
funkcji minimum).

Rysunek 40 Erozja. Obliczanie wartoci piksela za pomoc elementu strukturalnego

Operacja ta powoduje, e elementy przetwarzanego obrazu maj wygadzone brzegi


i usuwane s drobne szczegy. Erozja usuwa odizolowane, drobne wyrnione obszary, czyli
szumy.

Rysunek 41 Wykonanie operacji erozji na obrazie rzeczywistym

67

W OpenCV te operacje wykonywane s funkcjami cvDilate() oraz cvErode():


void cvErode(IplImage* src,IplImage* dst,IplConvKernel* B = NULL,
int iterations = 1 );
void cvErode(IplImage* src,IplImage* dst,IplConvKernel* B = NULL,
int iterations = 1 );

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.

Funkcj, ktra obsuguje te operacje jest cvMorphologyEx():


void cvMorphologyEx(
const CvArr* src, CvArr* dst, CvArr* temp,
IplConvKernel* element,int operation,int iterations = 1);

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)

Rysunek 42 Wykonanie operacji a - otwarcia i b zamknicia na obrazie rzeczywistym

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.

Rysunek 43 Wykonanie operacji gradientu morfologicznego na obrazie rzeczywistym

Ostatnie dwie operacje detekcja minimum i maksimum lokalnego maj za zadanie


wyodrbnid skrawki obrazu, ktre s znaczco janiejsze lub ciemniejsze od ich najbliszych
ssiadw. Uywa si tych operacji w celu wyizolowania czci obiektu, ktra widocznie rni
si jasnoci w stosunki do obiektu, w ktrym si znajduje. Operacje te mog byd opisane w
sposb nastpujcy:

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)

Rysunek 44 Wykonanie morfologii a - TopHat, b BlackHat na obrazie rzeczywistym

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.

Rysunek 45 Prosty przykad zastosowania histogramu

70

Istotnym czynnikiem wpywajcym na czytelnod i przydatnod histogramu jest odpowiedni


dobr szerokoci (zakresu) koszy. Poniej pokazany jest typowy problem zwizany z bdnym
doborem wartoci z przedziau.

Rysunek 46 Przykad bdnego oszacowania szerokoci koszw histogramu

Jak widad nieprawidowy dobr szerokoci przedziau generuje trudny do interpretacji


rozkad (w tym przypadku) punktw od lewej do prawej strony obrazu.
Opisywane powyej histogramy s jednowymiarowe. Istniej rwnie odpowiedniki dwu
oraz trjwymiarowe. Wszystkie z nich s wspierane przez OpenCV. Histogram w tej bibliotece
jest reprezentowany przez specjalny typ danych CvHistogram. Histogram tworzony jest
za pomoc funkcji cvCreateHist():
CvHistogram* cvCreateHist(int dims,int* sizes,int type,
float** ranges = NULL, int uniform = 1);

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

Rysunek 47 Programowa realizacja histogramu w OpenCV

Histogram zosta wygenerowany na podstawie poniszego kodu:


#include <cv.h>
#include <highgui.h>
#pragma comment (lib, "cv210")
#pragma comment (lib, "highgui210")
IplImage* image= 0;
IplImage* imgHistogram = 0;
IplImage* gray= 0;
CvHistogram* hist;
int main(){
image = cvLoadImage("kuchnia.jpg",1);
//okreslenie rozmiaru histogramu (iloci koszy)
int size[] = {256};
//warto kosza i jego znormalizowana warto
float val;
int norm;
//zakres jasnoci
float range[] = { 0, 256 };
float* ranges[] = { range };
//warto minimalna i maksymalna histogramu
float min_val = 0, max_val = 0;
//konwersja wejsciowego obrazu kolorowego do 8 bitowego w skali szaroci
gray = cvCreateImage( cvGetSize(image), 8, 1 );
cvCvtColor( image, gray, CV_BGR2GRAY );
//Tworzenie okien do pokazania rezultatu

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;
}

Widad po histogramie, e oryginalny obraz by delikatnie zaciemniony. Brakuje pikseli


o wysokim poziomie jasnoci. Spowodowane byo to faktem, e by robiony przy sabym
owietleniu.
OpenCV zawiera kilka ciekawych funkcji modyfikujcych histogramy. Za pomoc funkcji
cvNormalizeHist():
cvNormalizeHist( CvHistogram* hist, double factor );

mona znormalizowad wartoci z koszykw. Hist jest przetwarzanym histogramem, factor za


wartoci, do ktrej bdzie przeprowadzana normalizacja (zazwyczaj jest to liczba 1).
Kolejn przydatn funkcj jest cvThreshHist():
cvThreshHist( CvHistogram* hist, double factor );

ktra dokonuje progowania wartoci w koszykach w zalenoci od parametru factor. Jeeli


wartoci w koszykach s poniej factor wwczas wpisywana jest tam wartod 0. Czsto
wykorzystuje si t operacj do usunicia szumw z obrazu widocznych na histogramie.
74

Funkcja cvGetMinMaxHistValue():
void cvGetMinMaxHistValue(const CvHistogram* hist,float* min_value, float*
max_value, int* min_idx = NULL, int* max_idx =NULL);

zwraca wskaniki min_value, max_value, min_idx, max_idx, ktre s wartociami najmniejsz


i najwiksz wystpujcymi w histogramie oraz indeksem koszy, w ktrych si znalazy.
Gdy na histogramie widoczne s puste koszyki i nie wszystkie odcienie szaroci s
na obrazie wykorzystywane to warto zastosowad wyrwnywanie histogramu. Operacja
ta polega na przeksztaceniu jasnoci punktw obrazu

w taki sposb, aby supki koszy

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.

Rysunek 48 Programowa realizacja rwnowaenia histogramu w OpenCV

Na rysunku po wyrwnaniu histogramu widoczna jest poprawa kontrastu i ostroci. Elementy


obrazu s bardziej widoczne i czytelne.
Na zakooczenie tego podrozdziau zostanie opisana funkcja cvCalcBackProject().
Jej zadaniem jest obliczenie tzw. projekcji wstecznej (ang. back projection) za pomoc
75

histogramu. Operacja ta polega na porwnaniu obiektw z obrazu wejciowego z wczeniej


utworzonym histogramem. Jeeli histogram zosta stworzony z obrazu, na ktrym znajdowa
si tylko jeden obiekt np. rka, to na obrazie wyjciowym po projekcji wstecznej ten obiekt
powinien zostad wyeksponowany. Po zastosowaniu dodatkowego progowania powinien zostad
otrzymany binarny obraz rki. Definicja funkcji wyglda nastpujco:
void cvCalcBackProject(IplImage** image,CvArr* back_project,
const CvHistogram* hist);

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

W celu wykrycia ruchu na sekwencjach obrazw pobieranych z kamery naley badad


zmian pooenia obiektw na kolejnych klatkach. Wyznaczenie wektora ruchu pomidzy
76

dwiema kolejnymi klatkami sekwencji jest podstawowym zagadnieniem parametryzacji ruchu.


Do opisania tego procesu naley zapoznad si z dwiema definicjami:

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.

Rysunek 51 Rzutowanie rzeczywistego wektora ruchu na paszczyzn obrazu

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

Rysunek 52 Przeksztacenie jednego obrazu w drugi za pomoc przepywu optycznego

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

Rysunek 53 Rnica pomidzy polem przepywu optycznego a polem ruchu

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

Metody ledzenia ruchu

Istniej trzy podstawowe grupy metod wyznaczania przepywu optycznego:

metody gradientowe wykorzystujcych analiz pochodnych przestrzennych


i czasowych intensywnoci obrazu,

metody czstotliwociowe bazujce na filtrowaniu informacji z obrazu


w dziedzinie czstotliwoci,

metody korelacyjne przeszukujce obraz w poszukiwaniu dopasowania


regionw (odpowiednioci fragmentw obrazu).

Wszystkie metody z tych grup oparte s na trzech podstawowych etapach przygotowania


obrazu do detekcji ruchu:
1. Wstpne filtrowanie obrazu w celu uwydatnienia analizowanych obszarw oraz
zwikszenia stosunku sygnau do szumu (ang. SNR Signal to Noise Ratio).
2. Przeprowadzenie wstpnych pomiarw w celu obliczenia
pochodnych po czasie oraz lokalnych powierzchni korelacji.
78

czstkowych

3. Poczenie wczeniejszych wynikw w celu wygenerowania dwuwymiarowego


przepywu optycznego.
Dokadny opis teoretyczny wymienionych metod mona znaled w publikacji [12]. W tym
rozdziale istot rzeczy jest opis wybranych metod zaimplementowanych w OpenCV.

3.9.2

Opis i implementacja wybranych metod

Biblioteka dostarcza implementacj najpopularniejszych algorytmw ledzenia ruchu


takich jak metody gradientowe Lukas Kankade, Horn Schunck, metod dopasowania
blokowego oraz metod korelacyjn mean-shift i cam-shift.
3.9.2.1

Metoda Lukas Kankade

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.

Rysunek 54 Schemat piramidalnego algorytmu LK

Piramidalny algorytm LK w OpenCV skada si z dwch etapw:


1. Znajd punkty dobre do ledzenia.
2. Uruchom ptl ledzc zadane punkty.

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.

Rysunek 55 Przykad doboru punktw dobrych do ledzenia

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

rdo obrazu *8+

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)

Funkcja ta pozwala na znalezienie pooenia zadanych punktw z pierwszej klatki na drugiej


klatce. Wsprzdne punktw s podawane z subpikselow dokadnoci.

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

Metoda Horn Schunck

Metoda zaproponowana przez Horna i Schuncka oparta jest na rwnaniach przepywu


optycznego. Zgodnie z tym rwnaniem intensywnod obrazu (
) zalenego rwnie
od czasu, pozostaje staa przez ca trajektori ruchu:
(

Rwnanie to mona zapisad w postaci:


( )
Pochodne
jako (

) gdzie

s skadow poziom i pionow wektora prdkoci, ktry mona zapisad


i

Przyjmujc, e

s gradientami obrazu

odpowiednio dla wsprzdnych


oznaczajcych zmian intensywnoci piksela
w przestrzeni oraz czasie, rwnanie (*) mona zapisad w postaci:
) (

( )

bdcym jednoczenie warunkiem przepywu optycznego. Rwnanie to ma jednak dwie


niewiadome u i v. Jego rozwizanie wymaga dodatkowych warunkw. Biorc pod uwag fakt,
e punkty znajdujce si blisko siebie, nalece do tego samego obiektu poruszaj si z tak
sam prdkoci, w tym samym kierunku mona zaoyd warunek pynnoci ruchu. Warunek
ten najczciej zapisuje si jako sum kwadratw laplasjanw x i y pola przepywu optycznego
w postaci Laplasjanw:
(

Miara zmiany intensywnoci pikseli na obrazie wyraa si wzorem [13]:

oraz miara niegadkoci pola przepywu:


(

Obliczenie pola przepywu optycznego sprowadza si do minimalizacji poniszego


funkcjonau:
(

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
);

Pierwsze dwa parametry zostay opisane przy funkcji cvCalcOpticalFlowPyrLK(). Argument


usePrevious wskazuje algorytmowi, aby korzysta z prdkoci vel oraz vely obliczonych z
poprzedniej klatki jako startowe parametry do obliczenia nowych prdkoci. Parametry velx i
vely s nowo obliczonymi prdkociami. Kolejna wartod lambda jest sta regulacji omawian
powyej. Ostatni parametr criteria zosta rwnie omwiony przy funkcji
cvCalcOpticalFlowPyrLK().

3.9.2.3

Metoda Block Matching

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.

3.10 ledzenie obiektw


ledzenie obiektw w OpenCV zostao zrealizowane za pomoc dwch metod mean-shift
oraz cam-shift.
Algorytm mean-shift jest metod znajdowania lokalnego ekstremum w rozkadzie gstoci
zbioru danych [9+. Jest to algorytm deterministyczny, gdy wprowadza kilka ograniczeo. Przede
wszystkim analizuje tylko dane znajdujce si blisko szczytu (ekstremum) poprzez naoenie
lokalnego okna na dane w jego otoczeniu.
Kolejne kroki algorytmu mean-shift wygldaj nastpujco:
1. Dobranie parametrw okna przeszukiwao:
- wstpn pozycj,
- typ rozkadu (stay, wielomianowy, wykadniczy lub Gaussowski),
- ksztat ( symetryczny lub niesymetryczny, koowy lub prostoktny),
- rozmiar.
2. Oblicz rodek cikoci okna.
3. Wyrodkuj okno w odniesieniu do rodka cikoci.
4. Powrd do punktu 2. jeeli okno zmienio pozycj.

84

Rysunek nr 57 pokazuje zasad dziaania tego algorytmu:

Rysunek 57 Zasada dziaania algorytmu mean-shift

13

Warunek stopu algorytmu wyznacza parametr okrelajcy minimaln zmian pooenia


okna przeszukiwao. Jeeli jest ona dostatecznie maa algorytm si zatrzymuje. Zgodnie
z zaoeniami dziaania metody na prac algorytmu nie maj wpywu punkty oddalone od okna
przeszukiwao.
W celu wykorzystania tego algorytmu do detekcji zmian pooenia obiektw na obrazie
metoda musiaa zostad zmodyfikowana i rozbudowana. Przede wszystkim naleny najpierw
okrelid cech ledzonego obiektu np. kolor. Nastpnie pierwsze okno przeszukiwao powinno
zostad ustawione w miejscu wystpowania tego obiektu, nastpne kroki algorytmu s tosame
z podstawow metod. Implementacj algorytmu w OpenCV realizuje funkcja cvMeanShift(),
ktra opiera si o analiz obrazu projekcji wstecznej histogramu, pobranego z pierwszego
okna przeszukiwao:
int cvMeanShift(
const CvArr* prob_image,
CvRect window,
CvTermCriteria criteria,
CvConnectedComp* comp
);

Pierwszym parametrem prob_image jest obraz otrzymany w wyniku projekcji wstecznej


histogramu za pomoc omawianej w rozdziale 3.8. funkcji cvCalcBackProject(). Drugi
parametr window okrela wstpne pooenie i rozmiar okna przeszukiwao. Kolejny argument
criteria omawiany by przy innych funkcjach i okrela maksymaln ilod krokw algorytmu.
Ostatni parametr comp jest struktur wynikow zawierajc informacje o aktualnym pooeniu
okna przeszukiwao (comp->rect) oraz iloci pikseli, ktre obejmuje (comp->area). Funkcja
zwraca ilod wykonanych iteracji algorytmu.
Rozwinicie nazwy drugiego algorytmu cam-shift oznacza cigle adaptowany mean-shift
(ang. continuously adaptive mean-shift). Oparty jest na algorytmie mean-shift jednak ledzi
13

rdo obrazu: *8+

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/.

Rysunek 58 Sposb dziaania algorytmu cam-shift

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

Program ma za zadanie umoliwienie tworzenia figur geometrycznych za pomoc ruchw


rk analizowanych przez kamer. Pierwszym etapem byo wyeksponowanie doni znajdujcych
si na obrazie, za pomoc filtracji kolorw odpowiadajcych tonom skrnym. Nastpnie
zaimplementowane algorytmy badaj ruch i pooenie doni, za pomoc ktrych mona
przystpid do tworzenia obiektw na interaktywnym ekranie.

Przetwarzanie

Akwizycja obrazu

Interfejs

Rysowanie

Rysunek 59 Diagram funkcjonowania programu Finger Drawing.

87

4.1.2

Problemy

W wielu opracowaniach naukowych, rwnie zagranicznych uniwersytetw metoda


ledzenia i odnajdywania doni jest podobna. Odbywa si to za pomoc analizy tonw skry.
Metoda ta daje dobre rezultaty jednak przy pewnych zaoeniach. Pierwszym z nich s
niezmienne warunki owietleniowe, gdy barwa jest cile zwizana z owietleniem i razem z
nim, zmieniaj si jej parametry.
Kolejnym problemem jest otoczenie. Wiele przedmiotw posiada barw podobn do
ludzkiej skry. Stanowi to problem, ktry jest minimalizowany przez takie sposoby jak
odrzucanie zbyt maych obiektw, uwaanych za przypadkowe.
W kadrze kamery najczciej znajduje si rwnie gowa, ktrej skra ma takie same tony
jak skra doni. Moe to stanowid problem przy wykrywaniu krawdzi doni, gdy oba obiekty
bd na siebie nachodzid. Czasem problem ten rozwizuje zwyczajne oddalenie doni od gowy,
gdy mog byd one wwczas owietlone z rn intensywnoci co czsto sprawia, e gowa
staje si niewidoczna dla programu.
W celu optymalizacji dziaania algorytmw detekcji uytkownik moe skorzystad
z suwakw, ktre zmieniaj wartoci przestrzeni kolorw HSV przetwarzanego obrazu. Na
koniec zaznaczajc prostoktny obszar doni na obrazie, pozwala programowi na
wygenerowanie histogramu zakresu barw doni, bdcego podstaw dalszego dziaania
algorytmw detekcji doni.

4.1.3

Opis dziaania programu

4.1.3.1

Konwersja i zawenie przestrzeni kolorw.

Obraz pobierany z kamery jest konwertowany z przestrzeni RGB do HSV. Przestrzeo


ta pozwala nam na prac tylko z barw (ang. Hue), co uatwia zawenie przestrzeni kolorw
do interesujcego zakresu tonu skry. Z wykorzystaniem dostpnych suwakw moliwe jest
sterowanie zakresem przestrzeni pozostaych kanaw, a co najistotniejsze kanaem jasnoci
(ang. Value). Wykorzystujc funkcj cvInRangeS() na podstawie dolnych i grnych przedziaw
suwakw, z obrazu HSV tworzona jest maska mask (obraz binarny) na ktrej uwidocznione s
tylko tony skrne. Nie jest ona jednak pozbawiona przypadkowych szumw czy te elementw,
ktre mog posiadad zblion barw do tonu skry ale nie s na tyle due, by znacznie
utrudniy dziaanie programu. W celu usunicia tego typu zakceo przeprowadzone jest kilka
elementarnych, dobranych dowiadczalnie operacji na obrazie. Pocztkowo naoone zostao
rozmycie medianowe (funkcja cvSmooth()), ktre wstpnie usuwa szumy. Nastpnie obraz
zostaje poddany erozji (cvErode()) w celu usunicia wikszych przypadkowych obiektw oraz
dylatacji (cvDilate()), aby uzupenid ksztat doni w masce.

88

Rysunek 60 Maska wejciowa

Rysunek 61 Maska po regulacji suwakami HSV

Rysunek 62 Maska po wygadzeniu

4.1.3.2

Tworzenie histogramu doni

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.

Rysunek 63 Zaznaczenie obszaru ROI

Rysunek 64 Histogram kanau Hue

4.1.3.3

Tworzenie obrazu wynikowego i wykrywanie konturw

Nastpnie funkcja cvCalcBackProject() wywoana z argumentami bdcymi kanaem Hue


oraz obliczonym histogramem zwraca obraz backproject w skali szaroci, na ktrym
wyeksponowane s obiekty w tonach skrnych. Na podstawie tego obrazu oraz stworzonej
przy pomocy suwakw maski obliczany jest ich iloczyn bitowy (cvAnd()), ktry po wygadzeniu
(cvSmooth()) stanowi binarny obraz wynikowy.

Rysunek 65 Obraz backproject

90

Rysunek 66 Obraz backproject po przetworzeniu

Na tak przygotowanym obrazie wykrywane s kontury. Za inicjacj odnajdywania


konturw odpowiedzialna jest funkcja cvStartFindContuors(), ktrej parametrami s obraz
wynikowy, przydzielona pamid, rodzaj konturu i sposb jego reprezentacji. Parametr
CV_RETR_EXTERNAL okrelajcy rodzaj szukanych konturw zosta wybrany, poniewa
poszukiwane s najbardziej zewntrzne kontury (np. kontury palcw, a nie wntrza doni).
CV_CHAIN_APPROX_SIMPLE sprawia, e kontur jest reprezentowany w pamici jako aocuch
punktw najbardziej przylegajcych do konturu. Nastpnie funkcja cvFindNextContour()
wyszukuje kolejno kontury zwracajc je jako sekwencj do obiektu struktury CvSeq. Dziki
takiej organizacji moliwy jest atwy dostp do poszczeglnych konturw. W ten sposb mona
odfiltrowad te kontury, ktre na pewno nie mog stanowid ksztatu doni, gdy s zbyt mae.
Wykorzystywana jest do tego funkcja cvContourArea(), ktra zwraca obszar konturu (w
wymiarze piksela kwadratowego). Wartod progowa (6000) zostaa wyznaczona
dowiadczalnie i zapewnia rozsdne minimum dla dopuszczalnej wielkoci doni, nawet,
gdy jest znacznie oddalona od kamery. Eliminuje za to wszelkie przypadkowe kontury, ktre
znajduj si pod w/w progiem. Mog to byd np. drobne, tymczasowe obiekty ktre zmieniy
swoj barw wskutek chwilowej zmiany owietlenia. Nastpnie za pomoc funkcji
cvDrawContours() rysowane s kontury doni.

Rysunek 67 Wykryty kontur na obrazie wynikowym

Z konturw wybierane s najwyej pooone punkty, ktre odpowiedzialne s


za sterowanie wskanikami bdcymi podstaw rysowania i sterowania obiektami.
4.1.3.4

Mechanizmy tworzenia obiektw

Ta czd opiera si w duej mierze na mechanizmach obiektowoci, dostarczanych przez


jzyk C++. Za dziaanie ledzenia i funkcji rysujcych w przewaajcej mierze odpowiedzialna
jest klasa, ktra potrzebuje dwch parametrw, aby realizowad swoje zadanie. Pierwszy
to pobrane wspomniane ju wczeniej maksymalne punkty doni, a drugi to informacja gdzie
ma byd wywietlany rezultat (obiekt IplImage). Punkt maksymalny doni wyznaczany jest
z tablicy punktw stanowicych kontur i jest to najwyej pooony punkt w osi pionowej.
Na ekranie oznaczany czerwonym okrgiem. Dwa okrgi z obu doni bd sterowad obiektami
(ang. pointerami) sucymi do nawigacji w programie. Koniecznoci byo ich zastosowanie ze
wzgldu na proceduralny charakter wykonywania programu. Dla oka ludzkiego wydaje si, e
czerwone punkty na czubkach doni wystpuj rwnoczenie. W rzeczywistoci przy jednej
iteracji programu rysowany jest jeden, a przy kolejnej drugi punkt. Dlatego te, zostay
utworzone dynamiczne obiekty, ktre posiadaj mechanizmy odpowiedzialne
91

za zapamitywanie pooenia kadego wskanika z osobna oraz w peni niezalene dziaanie


i interakcj z innymi aktywnymi obszarami ekranu.
Funkcj odpowiedzialn za nieustann analiz wskanikw jest kadorazowo wywoywana
funkcja PointersTracking(), ktra pobiera i analizuje pooenie maksymalnych punktw
doni zapisanych w wektorze punktw.
Nastpnie wywoywana jest funkcja checkAreaMarked(), ktra sprawdza, czy ktry
z pointerw nie znalaz si w obszarze ktrego z przyciskw bd suwakw koloru.
Ostatni funkcj interfejsu jest wyrysowanie na ekranie wszystkich aktywnych obiektw
i zdarzeo w tym tworzonych figur przez uytkownika drawExistingObjects(), ktrej
argumentem jest obraz na ktrym ma byd wywietlany.

4.1.4

Obsuga programu

Po wczeniu programu na ekranie pojawiaj si trzy okna dialogowe:

capture pokazuje cay interfejs uytkownika zawarty na obrazie pochodzcym


z kamery,

overview pokazuje mask binarn, ktrej zawartod modyfikowana jest


za pomoc suwakw,

settings zawiera panel suwakw, ktre steruj parametrami przestrzeni HSV


(hue_min, hue_max, sat_min, sat_max, val_min, val_max, smooth).

Rysunek 68 Okna suce do wstpnej kalibracji obrazu.

Uytkownik powinien zaczd od przygotowania maski wywietlanej w oknie overview.


Realizowane jest to za pomoc suwakw z okna settings. Parametry HSV powinny byd
92

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.

Rysunek 69 Interfejs uytkownika programu

Poniej zostay opisane funkcje przyciskw interfejsu:

rysuj! uruchamia tryb rysowania i dziaa w poczeniu z przyciskami linie, okrg


oraz fitting, ktrych wybr decyduje o sposobie i moliwym ksztacie rysowanych
figur:
- linie umoliwia rysowanie pojedynczych linii lub aocucha poczonych linii
tworzcych wielobok. Kady linia tworzca ten obiekt musi zostad zatwierdzona
wywietlonym tymczasowo przyciskiem ok,
93

- okrag umoliwia rysowanie okrgu o pooeniu rodka wskazywanego przez prawy


pointer. Promieo okrgu wyznaczany jest przemieszczeniem prawego pointera od
rodka okrgu na zewntrz,
- fitting umoliwia rysowanie okrgw za pomoc konturu wyznaczanego przez
okrny ruch prawego pointera, a nastpnie sprowadzanego do waciwego okrgu,
- OK akceptuje i zapisuje w pamici narysowany obiekt,

edytuj umoliwia edycj narysowanych obiektw. Do edycji nale:


- zmiana pooenia kadego z obiektw, za pomoc punktu centralnego obiektu,
- zmiana ksztatu wielobokw, za pomoc zmiany pooenia ich wierzchokw,
- zmiana dugoci promienia okrgw,

kolor umoliwia zmian kolorw krawdzi oraz wypeniania obiektw za pomoc


suwakw aktywowanych tym przyciskiem umoliwiajcych otrzymanie kadego
z kolorw przestrzeni RGB.

Sterowanie programem powinno odbywad si w nastpujcy sposb. Lewy pointer suy


do aktywowania przyciskw, prawy za do rysowania i edycji obiektw. Opis dziaania
i sterowania podczas tworzenia obiektw zosta opisany przy okazji wymieniania funkcji
przyciskw.

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

Program Face Detect ma za zadanie przechwycid obraz z kamery a nastpnie wyszukad


na nim twarze za pomoc metody Haar-Like. Oprogramowanie wyposaone jest rwnie
w filtry oraz funkcje poprawiajce jakod analizowanego obrazu. Dodatkowo
zaimplementowany zosta algorytm pozwalajcy na szybsze dziaanie programu dziki
wyodrbnieniu obszarw analizowanych pod ktem detekcji twarzy.

Przetwarzanie

Akwizycja obrazu

detekcja twarzy

Rysunek 70 Diagram funkcjonowania programu Face Detect

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

Opis dziaania programu

4.2.3.1

Zaadowanie klasyfikatora Haara

Na pocztku program aduje gotowy klasyfikator Haara do wykrywania frontowej twarzy,


ktry umieszczony jest w pliku XML (haarcascade_frontalface_alt.xml).

95

Tworzony jest on za pomoc funkcji Haar-like features wbudowanej w OpenCV sucej


do wykrywania obiektw na podstawie cech. Wykorzystuje ona metod zaproponowan przez
Paula Viola i Michaela Jonesa, ktra ma za zadanie wydobyd uyteczne informacje z obrazu
do klasyfikacji obiektw i ich ta. Metoda ta zostaa nastpnie rozwinita przez Rainera
Lienharta oraz Johena Maydta.
Algorytm funkcji Haar-like features opiera si na trzech podstawowych fazach:
1. Wybr zestawu cech
W metodzie Viola-Jenes cechy traktowane byy jako kombinacja dwch, trzech lub
czterech prostoktw. Ilod moliwych kombinacji poczenia prostoktw bya bardzo
dua, dlatego przy okrelonych zaoeniach zostaa wyselekcjonowana grupa, ktra
zostaa przedstawiona na rysunku nr 65. Nastpnie udoskonalony zestaw cech jeszcze
lepiej identyfikujcy poszukiwane obiekty zosta zaproponowany w metodzie LienhartMaydt (przedstawiony na rys. 66 ). Grupa ta zostaa podzielona na cechy krawdziowe,
liniowe oraz centralnie otoczone. Wanie z tego zestawu cech korzysta funkcja
z OpenCV.

Rysunek 71 Podstawowy zestaw cech zaproponowany przez Viola i Jones'a

Rysunek 72 Podstawowy zestaw cech zaproponowany przez Lienhart'a i Maydt'a

Zasada dziaania cech polega na odnajdywaniu obszarw, na ktrych rnica


pomidzy sum pikseli regionw ograniczonych czarnymi i biaymi prostoktami
znajduj si powyej pewnego progu. Na podstawie tej wartoci algorytm moe
zidentyfikowad czy badany obszar jest poszukiwanym obiektem czy jego tem.
Dla przykadu, prostoktne regiony oczu maj duo mniejsz intensywnod ni
obszar czoa, ten za duo wiksz od obszaru wosw (rysunek 67).

96

Rysunek 73 Przykad zastosowania cech do detekcji twarzy

2. Wykorzystywanie obrazu zintegrowanego do obliczenia wartoci cech


Obliczanie rnic prostoktnych obszarw na obrazie jest bardzo czasochonne,
dlatego algorytm detekcji obiektw wykorzystuje tzw. obraz zintegrowany (ang.
integral image). Jest on reprezentacj obrazu, ktra w punkcie o wsprzdnych
(x, y) przechowuje wartod sumy wartoci pikseli znajdujcych si na lewo
i powyej punktu (x, y) rysunek 68.
Obraz zintegrowany
(0,0)

Obraz oryginalny
(0,0)
Suma wszystkich
pikseli z szarego
regionu

(x, y)

(x, y)

Rysunek 74 Obliczanie obrazu zintegrowanego z oryginalnego

Wykorzystujc obraz zintegrowany sum kadego obszaru mona policzyd za pomoc


trzech operacji.
Obraz zintegrowany

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

Ten sposb obliczania sum pikseli z obszaru obrazu rdowego wykorzystywany


jest w metodzie Viola-Jonesa. Zmiana prototypw cech w metodzie LienhartaMaydta wymusia zmian sposobu obliczania regionw pikseli. Dokadny opis
modyfikacji przedstawiony zosta w publikacji [15].
3. Tworzenie klasyfikatora kaskadowego z wykorzystaniem algorytmu uczcego si
AdaBoost
Wykorzystuje on tzw. wzmocnienie adaptacyjne (ang. adaptive boosting). Jego
zadaniem jest uczenie tzw. sabych klasyfikatorw (ang. weak classifier), drzew
decyzyjnych (z dwoma lidmi tzn. jeeli wartod v cechy sabego klasyfikatora f jest
powyej pewnego progu t wwczas +1 (tak) oznacza znalezienie obiektw lub 1
(nie) jego brak.
{
Zadaniem algorytmu AdaBoost [16] jest wygenerowanie silnego klasyfikatora
z kaskady sabych. W przypadku obrazw, na ktrych wykryta ma zostad obiekt
wykorzystuje si technik przesuwnego okna. Z tak zeskanowanego obrazu
generowany jest zbir okien, ktre poddawane s weryfikacji przez klasyfikatory.
Na podstawie informacji z tych okien sabe klasyfikatory ucz si odrzucad obszary,
na ktrych na pewno nie znajduje si poszukiwany obiekt. W kadej ptli algorytm
skupia si na le wykrytych obszarach przez poprzednie klasyfikatory. Nadaje im
wysze wagi (gdy w nastpnej iteracji istnieje wiksze prawdopodobieostwo
prawidowego wykrycia obiektu). Wykorzystywanie tych wag przez nastpne
klasyfikatory pozwala na zawenie przestrzeni poszukiwao do coraz mniejszego
obszaru. Tak skonstruowany silny klasyfikator umoliwia szybkie wykrywanie
poszukiwanych obiektw. Proces odrzucenia obszarw niezawierajcych
poszukiwanego obiektu znajduje si na rysunku 76.
Peny zbir
okien obrazu

f1
1

f2
1

f3
1

fn
1

Okna z
poszukiwanymi
obiektami

Odrzucone okna
Rysunek 76 Budowa klasyfikatora kaskadowego

W OpenCV znajduj si wszelkie narzdzia potrzebne do konstruowania wasnego


klasyfikatora Haara dla konkretnego obiektu. Wszystkie programy znajduj si w katalogu
biblioteki C:/OpenCV2.1/bin. Program createsamples.exe tworzy zbir przykadowych obrazw
pozytywnych i negatywnych w postaci wektora uczcego (plik *.vec). Otrzymany plik
wykorzystywany jest do uczenia klasyfikatora za pomoc programu haartraining.exe.
98

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

Konwersja i zawenie przestrzeni kolorw

To zagadnienie realizowane jest niemal identycznie jak w przypadku programu Finger


Draw. Najpierw obraz z kamery konwertowany jest do przestrzeni HSV. Nastpnie suwakami
ustawiane s optymalne parametry przestrzeni w celu jak najlepsze detekcji tonw skrnych
przy aktualnych warunkach owietleniowych. Na podstawie tych parametrw tworzona jest
maska, ktra na obrazie binarnym pokazuje tylko barwy obrazu w tonie skry. Maska
poddawana jest otwarciu za pomoc funkcji cvErode() oraz cvDilate(). Nastpnie
wygadzana dodatkowo rozmyciem medianowym (cvSmooth()). Na koniec stosowany jest filtr
krawdziowy Cannyego (cvCanny()), aby wykryd krawdzie na podstawie, ktrych bdzie
obliczany kontur twarzy.

Rysunek 77 Okno maski po przetworzeniu

4.2.3.3

Wykrywanie konturw i ograniczenie obszaru do analizy

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

Rysunek 79 Efekt dziaania algorytmu Haar-Like

Rysunek 80 Interfejs programu oraz efekt koocowy detekcji

4.2.4

Moliwoci rozwoju

Pierwszym etapem rozwoju programu na pewno byoby stworzenie wasnego klasyfikatora


Haara, ktry pozwoliby na rozpoznawanie twarzy danej osoby. Nie jest to proces trudny
jednak wymagajcy duego nakadu czasowego.
100

Nastpnie program mgby zostad wyposaony w detekcj nastroju osoby stojcej


w kadrze kamery i jej pci. W 2007 roku niemiecki instytut Fraunhofer Institute stworzy
bibliotek pod nazw SHORE, ktrej aplikacja pozwalaa na detekcj osoby, jej nastroju oraz
pci. Taki rodzaj oprogramowania mgby dawad wymierne rezultaty w badaniu opinii klientw
na temat reklamy np. na ekranie LCD w sklepie. Takie stanowisko wyposaane w kamer
mogoby analizowad stopieo zaciekawienia oraz nastawienie do przedstawianej reklamy.

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

Rysunek 81 Diagram funkcjonowania programu Line Assist.

4.3.2

Problemy

Gwny problemem, by stan nawierzchni drogi, ktry przejawia si brakiem pasw,


ubytkami w asfalcie oraz zanieczyszczeniami.
Drugim problemem podczas nagrywania filmu do tego opracowania by brak stabilnoci
kamery. W rozwizaniach komercyjnych typu line assist kamera na stae jest wbudowana
w samochodu co uatwia analiz drogi.
Niewielkie zmiany wiata rwnie utrudniay odpowiednie przetworzenie obrazu w celi
detekcji samych linii drogi.

101

4.3.3

Opis dziaania programu

4.3.3.1

Wykrycie pasw drogi

Na pocztku obraz konwertowany jest do skali szaroci, aby mg zostad przetworzony


za pomoc filtru krawdziowego. Nastpnie wykrywane s krawdzie z wykorzystaniem filtru
Sobela (cvSobel()). Jego zadaniem jest policzenie pochodnych po X i Y w celu wydobycia
granic kolorw midzy jezdni (asfaltem) a liniami. Filtr zosta wybrany w sposb
dowiadczalny, by on bowiem najbardziej odporny na wahania owietlenia. W celu
ujednolicenia wykrytych konturw pasw zastosowane zostao rozmycie Gaussowskie
(cvSmooth() z parametrem CV_GAUSSIAN). Po tych operacjach obraz jest jednokanaowym
obrazem w skali szaroci, aby go zbinaryzowad i usund z niego mniej wyrane kontury
zastosowane zostao progowanie binarne (cvThreshold()) z progiem rwnym 10. W wyniku
tej operacji na drodze widoczne byy wyrane pasy jezdni.

Rysunek 82 Obraz po zastosowaniu filtru Sobela ze standardow mask 3x3

Rysunek 83 Obraz z wykrytymi krawdziami po zastosowaniu rozmycia Gaussowskiego

Rysunek 84 Rozmyty obraz po zastosowaniu progowania binarnego

102

4.3.3.2

Wyznaczenie punktw do analizy skrtu drogi

Obraz po binaryzacji zostaje poddany funkcjom odnajdywania konturw. Dziki temu


na obrazie zostan odnalezione punkty, ktre stanowi kontur jezdni. Kontur ten z sekwencji
zapisywany jest do tablicy punktw za pomoc funkcji cvCvtSeqToArray(), a nastpnie dla
wygody pracy do wektora punktw. Nastpnie funkcja LinePoints() z dowiadczalnie
dobranymi punktami odniesienia, wyszukuje punkty z konturu pasw (prawej czci pasw
rodkowych) oraz z konturu zewntrznej czci drogi (po prawej stronie) najbardziej od nich
oddalone. Tak wyznaczone cztery punkty (kolor czerwony na rysunku poniej) su do analizy
skrtu drogi.

Rysunek 85 Sposb wyznaczania punktw jezdni.

4.3.3.3

Detekcja kierunku oraz skrtu drogi.

Skrt drogi i jego intensywnod wyznaczane s na podstawie wzajemnego pooenia


punktw charakterystycznych rodkowego i prawego pasa.
Przy skrcie w prawo analizowane s lewe punkty. Interpretacja odbywa si na podstawie
badania aktualnego wychylenia dolnego lewego punktu (LD) w stosunku do lewego grnego
punktu odniesienia (LG). Jeeli rnic wsprzdnych X obu tych punktw znajdowaa si
w odpowiednim przedziale to byo to rozumiane jako skrt w prawo. Dodatkowym
zabezpieczeniem by warunek okrelajcy wzajemne pooenie prawych punktw (dolnego
i grnego) w stosunku do siebie. Dopiero po spenieniu tego drugiego warunku skrt w lewo
by wykrywany.
W przypadku badania skrtu w lewo bya dokonywana w sposb analogiczny. Wszystkie
warunki byy dobierane w sposb dowiadczalny na podstawienie badania zmian nachylenia
jezdni w czasie jazdy samochodem.
Kt skrtu kierownicy w lew i praw stron obliczany by na podstawie wzajemnego
pooenia lewych oraz prawych punktw odniesienia pomnoonych o wspczynnik dobrany
rwnie drog dowiadczaln.

103

lewy grny pkt.


odniesienia (LG)

prawy grny pkt.


odniesienia (PG)

lewy dolny pkt.


odniesienia (LD)

lewy grny pkt.


odniesienia (PD)

LD.x - LG.x

PD.x - PG.x

Rysunek 86 Sposb wyznaczania kierunku oraz skrtu drogi

Rysunek 87 Sposb dziaania algorytmu detekcji drogi

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,

[8] G. Bradski, A. Kaehler, Learning OpenCV, OReilly 2008


[9] M. Pawowski, Zastosowanie transformacji Hougha do analizy dwuwymiarowych
widm PITS, Institute of Electronic Materials Technology, Warszawa 2006
[10] J.F. Rivest, P. Soille, S. Beucher, Morphological gradients, Centre de
Merphologie Mathematique, Francja 1995
[11] G. Kukieka, J. Wonicki, Praktyczne aspekty wykorzystania metod morfologii
matematycznej w cyfrowym przetwarzaniu obrazw, Materiay konferencyjne z III
sympozjum naukowego Techniki przetwarzania obrazu, Serock 1997
[12] J.L. Barron, D.J. Fleet, S.S Beauchemin, Performance of Optical Flow Techniques,
Kluwer Academic Publishers, USA 1994
[13] B. Horn, B. Schunck, Determining Optical Flow using a Modified Horn and
Shuncks Algorithm, Arificial Intelligence Laboratory in MIT 1980
[14] A.Gyaourova, C. Kamath, C.Cheung Block matching for object tracking,
Lawrence Livermore National Laboratory 2003
[15] R. Lienhart, J. Maydt An Extended Set of Haar-like Features for Rapid Object
Detection, Intel Labs, Intel Corporation, USA 2002
[16] C. W. Lee, Yong Haur Tay "Empirical study of boosted weak classfier in object
detection problem", Universiti Tunku Abdul Rahman, Malaysia 2010
[17] R. Tadeusiewicz, P. Korohoda Komputerowa analiza i przetwarzanie obrazw,
Wyd. Fundacji Postpu Telekomunikacji, Krakw 1997
106

Strony internetowe
[W1]

Strona Wiki projektu biblioteki OpenCV: http://opencv.willowgarage.com/wiki/

[W2] Strona zawierajca aktualne wersje biblioteki:


____http://sourceforge.net/projects/opencv/
[W3] Strona Microsoft zawierajca aktualn wersj Visual Studio C++ Express:
____http://www.microsoft.com/express/downloads/
[W4]

rdo zdjcia: http://daystarvisions.com/Adjust.html

[W5]

rdo zdjcia: http://www.graphx.w8w.pl/ag/img/rgb_max.png

[W6]

rdo zdjcia: http://www.mozaikowo.com.pl/graph/gr_cone.png

[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]

Strona z instrukcj tworzenia wasnego klasyfikatora Haara:


http://note.sonots.com/SciSoftware/haartraining.html

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

Rysunek 39 Wykonanie operacji dylatacji na obrazie ................................................................. 67


Rysunek 40 Erozja. Obliczanie wartoci piksela za pomoc elementu strukturalnego .............. 67
Rysunek 41 Wykonanie operacji erozji na obrazie rzeczywistym ............................................... 67
Rysunek 42 Wykonanie operacji a - otwarcia i b zamknicia na obrazie rzeczywistym .......... 69
Rysunek 43 Wykonanie operacji gradientu morfologicznego na obrazie rzeczywistym ............ 69
Rysunek 44 Wykonanie morfologii a - TopHat, b BlackHat na obrazie rzeczywistym ............. 70
Rysunek 45 Prosty przykad zastosowania histogramu .............................................................. 70
Rysunek 46 Przykad bdnego oszacowania szerokoci koszw histogramu ............................ 71
Rysunek 47 Programowa realizacja histogramu w OpenCV ....................................................... 73
Rysunek 48 Programowa realizacja rwnowaenia histogramu w OpenCV............................... 75
Rysunek 49 Obraz wejciowy, histogram zostanie obliczony z obszaru zaznaczonego
czerwonym prostoktem ............................................................................................................ 76
Rysunek 50 Obraz po projekcji wstecznej. Wyeksponowane zostay tylko te barwy, ktre
najlepiej pasoway do wartoci z histogramu. ............................................................................ 76
Rysunek 51 Rzutowanie rzeczywistego wektora ruchu na paszczyzn obrazu ......................... 77
Rysunek 52 Przeksztacenie jednego obrazu w drugi za pomoc przepywu optycznego .......... 77
Rysunek 53 Rnica pomidzy polem przepywu optycznego a polem ruchu ........................... 78
Rysunek 54 Schemat piramidalnego algorytmu LK ..................................................................... 79
Rysunek 55 Przykad doboru punktw dobrych do ledzenia .................................................... 80
Rysunek 56 Efekt dziaania algorytmu PyrLK. Czerwonymi kropkami zaznaczone zostay punkty
dobre do ledzenia, a kolorem niebieski trajektoria zmiany pooenia piksela (przepyw
optyczny) ..................................................................................................................................... 81
Rysunek 57 Zasada dziaania algorytmu mean-shift ................................................................... 85
Rysunek 58 Sposb dziaania algorytmu cam-shift ..................................................................... 86
Rysunek 59 Diagram funkcjonowania programu Finger Drawing............................................... 87
Rysunek 60 Maska wejciowa ..................................................................................................... 89
Rysunek 61 Maska po regulacji suwakami HSV .......................................................................... 89
Rysunek 62 Maska po wygadzeniu ............................................................................................ 89
Rysunek 63 Zaznaczenie obszaru ROI ......................................................................................... 90
Rysunek 64 Histogram kanau Hue ............................................................................................. 90
Rysunek 65 Obraz backproject . .................................................................................................. 90
Rysunek 66 Obraz backproject po przetworzeniu ...................................................................... 90
Rysunek 67 Wykryty kontur na obrazie wynikowym .................................................................. 91
Rysunek 68 Okna suce do wstpnej kalibracji obrazu. ........................................................... 92
Rysunek 69 Interfejs uytkownika programu.............................................................................. 93
Rysunek 70 Diagram funkcjonowania programu Face Detect .................................................... 95
Rysunek 71 Podstawowy zestaw cech zaproponowany przez Viola i Jones'a ............................ 96
Rysunek 72 Podstawowy zestaw cech zaproponowany przez Lienhart'a i Maydt'a .................. 96
Rysunek 73 Przykad zastosowania cech do detekcji twarzy ...................................................... 97
Rysunek 74 Obliczanie obrazu zintegrowanego z oryginalnego ................................................. 97
Rysunek 75 Obliczanie sumy pikseli regionu R obrazu rdowego za pomoc czterech
punktw obrazu zintegrowanego ............................................................................................... 97
Rysunek 76 Budowa klasyfikatora kaskadowego........................................................................ 98
Rysunek 77 Okno maski po przetworzeniu ................................................................................. 99
Rysunek 78 Obliczony kontur i naoony prostokt stanowicy ROI dla algorytmu Haar-Like 100
109

Rysunek 79 Efekt dziaania algorytmu Haar-Like ...................................................................... 100


Rysunek 80 Interfejs programu oraz efekt koocowy detekcji ................................................... 100
Rysunek 81 Diagram funkcjonowania programu Line Assist. ................................................... 101
Rysunek 81 Obraz po zastosowaniu filtru Sobela ze standardow mask 3x3......................... 102
Rysunek 82 Obraz z wykrytymi krawdziami po zastosowaniu rozmycia Gaussowskiego ....... 102
Rysunek 83 Rozmyty obraz po zastosowaniu progowania binarnego ...................................... 102
Rysunek 84 Sposb wyznaczania punktw jezdni. ................................................................... 103
Rysunek 85 Sposb wyznaczania kierunku oraz skrtu drogi ................................................... 104
Rysunek 86 Sposb dziaania algorytmu detekcji drogi ............................................................ 104

110

Dodatek. Opis plikw programw


Program Finger Draw
Pliki:
activeareas.h plik nagwkowy z deklaracj podstawowej klasy ActiveAreas
zawierajcej wszystkie aktywne obiekty: przyciski, pointery, aktywne obszary,
trackbary oraz funkcje obsugujce wszystkie zdarzenia takie jak: rysowanie,
wybieranie opcji rysowania oraz koloru,
activeareas.cpp zawiera definicje metod znajdujcych si w pliku
activeareas.h
drawings.h plik nagwkowy z deklaracj klasy Drawings zawierajcej
elementy niezbdne do rysowania obiektw. Od niej dziedzicz inne klasy: Circle,
Rectangler, Lines, ktrych obiekty rysowane s przez program.
drawings.cpp zawiera definicje metod znajdujcych si w pliku drawings.h,
functions.h plik nagwkowy z deklaracj pomocniczych funkcji globalnych,
uatwiajcych realizacj takich operacji jak iloczyn skalarny, porwnywanie dwch
punktw, obliczanie punktu rodkowego prostokta i inne.
functions.cpp zawiera definicje metod znajdujcych si w pliku
functions.h,
main.cpp zawiera program gwny.

Program Face Detect

Plik main.cpp zawiera program gwny realizujcy wszystkie funkcje niezbdne


do detekcji twarzy oraz optymalizacji dziaania programu.

Program Line Assist


Plik main.cpp zawiera program gwny realizujcy wszystkie funkcje niezbdne do
detekcji drogi i wyznaczania kierunku jej skrtu.

111