Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
OpenCV
– systemy wizyjne
Rafał Kułaga
Systemy monitoringu, urządzenia automatycznie liczące klientów w centrach handlowych, aparaty cyfrowe
z wyzwalaczem aktywowanym uśmiechem, inteligentne pociski rakietowe – wszystkie z tych urządzeń
korzystają z dobrodziejstw cyfrowego przetwarzania obrazów i rozpoznawania wzorców. Jeszcze do
niedawna, wykorzystanie podstawowych algorytmów z tej dziedziny wymagało od programisty dobrej
znajomości podstaw matematycznych oraz zagadnień związanych z cyfrowym przetwarzaniem sygnałów
(ang. DSP – Digital Signal Processing). Sytuacja ta uległa jednak zmianie wraz z opracowaniem biblioteki OpenCV, implementującej wszystkie najważniejsze algorytmy. Zapraszam do lektury!
.pl
Żyjemy w czasach, gdy postęp automatyzacji co-tronicznego jest niezwykle trudna w realizacji. Wynika to raz to większej liczby dziedzin życia jest nie- głównie z faktu, iż przetwarzanie w komórkach nerwowych software.com
unikniony. Wynika to nie tylko z wysokich kosz- i mózgu odbywa się w sposób ogromnie zrównoleglony tów ludzkiej pracy, lecz również z ułomności na- – nie mamy nawet świadomości, jak potężnym i złożonym
linux@
szych zmysłów – głównie wzroku i słuchu. Nie jesteśmy w narzędziem obliczeniowym jest nasz umysł.
stanie zauważyć migotania diody jeżeli odbywa się ono ze
W tym artykule zajmiemy się przechwytywaniem, prze-
zbyt dużą częstotliwością, nasz zmysł wzroku reaguje na twarzaniem oraz analizą obrazów. Z pewnością zauważysz, bardzo ograniczoną szerokość pasma fal elektromagnetycz- że zastosowanie omawianych technik powoduje wiele po-nych. Podobnie jest ze słuchem – nie słyszymy dźwięków o ważnych problemów natury technicznej. Sytuacja ulega jed-bardzo wysokiej częstotliwości (powyżej 20 kHz – ultradź- nak systematycznej poprawie, wraz z postępami badań w więków), ani drgań o niskiej częstotliwości (poniżej 20 Hz dziedzinach takich jak sztuczna inteligencja (sieci neurono-
– infradźwięków), mimo iż oddziaływują one bardzo nieko- we), cyfrowe przetwarzanie sygnałów (DSP) oraz przetwa-rzystnie na nasze zdrowie i samopoczucie.
rzanie równoległe. Techniki, których zastosowanie uprasz-
Znacznie większe możliwości w tym zakresie daje nam cza biblioteka OpenCV, znalazły swoje zastosowanie w inte-sprzęt elektroniczny. Rozmaite urządzenia pozwalają na reje- ligentnych systemach uzbrojenia, przemyśle, robotyce, han-strację zjawisk, które zachodzą bardzo szybko lub bardzo po- dlu oraz systemach monitoringu.
woli, albo w ogóle nie są odbierane przez ludzkie zmysły. Nie
ulegają one zmęczeniu, mogą pracować w bardzo ciężkich Systemy wizyjne
warunkach (pod warunkiem, że zostaną do nich odpowiednio Zanim przejdziemy do dalszej części artykułu, w której zaj-przystosowane) oraz, na dłuższą metę, są znacznie tańsze.
miemy się praktyczną realizacją funkcji związanych z syste-
Niestety, okazuje się, że realizacja zadań charaktery- mami wizyjnymi przy użyciu biblioteki OpenCV, warto za-stycznych dla ludzkiego mózgu za pomocą sprzętu elek- dać sobie pytanie, czym tak naprawde są systemy wizyjne?
58
październik 2009
www.lpmagazine.org
59
Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
Budowa systemu wizyjnego
tych oferowanych jako gotowe rozwiąza- że być również inny, przetworzony obraz wraz
Systemem wizyjnym nazywamy zespół urzą-
nia), element ten jest zbudowany w opar- ze zbiorem dodatkowych danych (np. położe-
dzeń, wykorzystywanych w celu badania oto-
ciu o systemy wbudowane – dzięki po- niem interesujących nas cech). Przykładem ta-
czenia w sposób podobny do tego, w jaki reali-
stępowi technologi wielordzeniowej we kiego zastosowania biblioteki OpenCV jest roz-
zowane jest to przez nasz mózg, tzn. przy pomo-
współczesnych układach scalonych SoC wiązanie zastosowane przez firmę Google w ce-
cy odbieranego światła. Typowy system wizyj-
(ang. System-on-Chip), możliwa stała się lu odpowiedniego dopasowania danych pocho-
ny składa się z następujących elementów:
realizacja nawet bardzo skomplikowanych dzących z systemu Google Maps do obrazów
algorytmów.
satelitarnych, wykorzystywanych w programie
ó Urządzenia rejestrującego obraz – w każ-
Google Earth.
dym systemie wizyjnym musi znajdować W większości przypadków, systemowi wizyj-
Następnym przykładem są aplikacje gra-
się urządzenie odpowiedzialne za rejestro- nemu towarzyszą dodatkowe urządzenia, takie ficzne, w których algorytmy analizy i przetwa-wanie obrazu i przesyłanie go do urządzenia jak aktuatory, służące do zmiany stanu otocze- rzania obrazu wykorzystywane są do korekcji przetwarzającego. W większości systemów nia. Niekiedy konieczne jest również zastoso- zdjęć oraz nowoczesne interfejsy, pozwalające wizyjnych jest to kamera cyfrowa podłączo- wanie dodatkowych czujników (np. ultradźwię- na obsługę aplikacji przy użyciu gestów.
na za pomocą odpowiedniego interfejsu lub kowych czujników odległości) w celu zwięk-
Coraz większe znaczenie zyskują również
karta frame grabber, służaca do przechwyty- szenia możliwości systemu wizyjnego lub za- pojazdy bezzałogowe, sterowane przy wykorzy-wania obrazu z urządzenia analogowego;
bezpieczeniem przed błędami, które mogłyby staniu danych pochodzących z kamery. Bez ich
ó Urządzenia przetwarzającego z odpowied- być katastrofalne w skutkach.
wykorzystania, niemożliwa byłaby eksploaracja
nim oprogramowaniem – często jest to
kosmosu, w tym większość misji mających na
standardowy komputer PC z zainstalowa- Zastosowanie systemów
celu badanie planety Mars. Możesz zastanawiać
nym odpowiednim oprogramowaniem. W wizyjnych i przetwarzania obrazów
się, dlaczego w takich przypadkach nie używa się
części systemów wizyjnych (szczególnie Systemy wizyjne oraz algorytmy przetwarzania zdalnego sterowania, które jest przecież znacznie i analizy obrazów znajdują obecnie bardzo wiele bardziej niezawodne. Decyzja taka jest spowodo-Listing 1. Pierwszy program korzystający z bi-
zastosowań. Warto jednak zastanowić się, jakie wana bardzo dużą odległością, którą fala elektro-
blioteki OpenCV
możliwości daje ich zastosowanie, tzn. co mo- magnetyczna przebywa w czasie tak długim, iż
#include
żemy zrobić dalej z wynikami działania algoryt- uniemożliwia to skuteczne sterowanie.
#include
mów w nich wykorzystywanych?
Bardzo ważną dziedziną, w której syste-
#include
Bardzo często, szczególnie w zastosowa- my wizyjne odnalazły swoje zastosowanie, jest
int main(int argc, char *argv[])
niach przemysłowych, działanie systemu wizyj- przemysł zbrojeniowy. Zaawansowane techniki
{
nego prowadzi do podjęcia konkretnej decyzji, analizy, przetwarzania obrazu i rozpoznawania
IplImage* img;
np. sprawdzany produkt jest wadliwy. Od osoby cech, pozwalają na automatyczne naprowadza-
if(argc != 2)
projektującej system zależy, czym będzie skut- nie pocisków rakietowych tak, aby trafiały do-
{
kowała taka decyzja. W większości wdrożeń kładnie w cel. Odbywa się to poprzez budowę
printf("Uzycie: hw
przemysłowych, systemy wizyjne są dodatkowo modelu celu, a następnie jego odnajdywanie (za
pliku>\n");
wspierane danymi pochodzącymi z czujników. pomocą odpowiednich algorytmów) w obrazie
return 1;
Efektem działania algorytmów wizyjnych mo- pochodzącym z kamer.
}
//wczytanie pliku
img = cvLoadImage(argv[1]);
//prosta transformacja -
wygładzanie
cvSmooth(img, img, CV_GAUSSIAN,
3, 3);
//otwarcie okna
cvNamedWindow("OpenCV Hello
World!", CV_WINDOW_AUTOSIZE);
//wyświetlenie obrazu
cvShowImage("OpenCV Hello
World!", img);
//oczekiwanie na naciśnięcie
klawisza
cvWaitKey();
//zakończenie
cvReleaseImage(&img);
cvDestroyWindow("OpenCV Hello
World!");
return 0;
}
Rysunek 1. Pierwsza aplikacja w bibliotece OpenCV
58
październik 2009
www.lpmagazine.org
59
Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
Problemy i ograniczenia
to łatwo wytłumaczyć – czy znasz prosty sposób co ogranicza ich wykorzystanie w aplikacjach
Niestety, szerokie zastosowanie systemów wi- ścisłego określenia wyglądu pingwina? Z pew- czasu rzeczywistego. Sieci neuronowe, pomimo zyjnych nadal napotyka wiele problemów. Wy- nością nie. Szczególnie dużym problemem jest iż nie odzwierciedlają w sposób dokładny bu-nikają one głównie z modelu przetwarzania da- fakt, iż nie chodzi to o opis typu: dwie nogi, krót- dowy ludzkiego mózgu, w wielu przypadkach nych, wykorzystywanych we współczesnych kie skrzydła, kolor czarno-biały, lecz o określe- okazują się dobrym rozwiązaniem. Ich zastoso-procesorach i mikrokontrolerach.
nie matematycznych zależności pomiędzy po- wanie wymaga czasochłonnego procesu ucze-
Jeżeli zastanowisz się chwilę nad większo- szczególnymi pikselami! Zwróć również uwa- nia, jednak samo użycie w celu przetwarzania ścią znanych Ci algorytmów, to z pewnością za- gę, że pingwin może przyjmować wiele póz, danych jest już bardzo szybkie.
uważysz, iż opierają się one na ściśle określo- może być częściowo zasłonięty, lub poprostu
nym wykorzystaniu danych wejściowych w ce- może to być dwuwymiarowa fotografia. Widać, Biblioteka OpenCV
lu otrzymania ostatecznego wyniku. Wszyscy że istnieje wiele problemów, z których część Własnoręczna implementacja algorytmów z znamy algorytmy takie jak sito Eratostenesa, wynika z samego faktu przedstawienia trójwy- dziedziny przetwarzania i analizy obrazów mo-poszukiwanie największego wspólnego dziel- miarowego świata w postaci dwuwymiarowej że być bardzo trudna, szczególnie dla mniej do-nika dwóch liczb, czy chociażby sortowanie bą- – wiadomo bowiem, że obiekt z przestrzeni trój- świadczonych programistów. W celu umożli-belkowe. Nie ulega wątpliwości, iż są one ści- wymiarowej może mieć, przynajmniej teore- wienia szerokiemu gronu użytkowników dostę-
słe. Co więcej – jednym z podstawowych kryte- tycznie, nieskończenie wiele prawidłowych re- pu do omawianych technik, została opracowa-riów poprawności każdego algorytmu jest wła- prezentacji w przestrzeni dwuwymiarowej.
na biblioteka OpenCV, której zastosowanie jest
śnie jego ścisłość i możliwość wielokrotnego za-
W celu rozwiązania tych problemów wy- głównym tematem tego artykułu.
stosowania dla dowolnych danych wejściowych korzystuje się, oprócz standardowych algoryt-
(spełniających konkretne założenia).
mów, sieci neuronowe oraz inne, bardziej skom- Historia biblioteki OpenCV
W analizie obrazów trudno jest jednak plikowane klasyfikatory. Algorytmy z dziedziny Historia biblioteki OpenCV sięga roku 1999, wskazać proste sposoby określania chociażby przetwarzania sygnałów cechują się dużym wy- kiedy to w firmie Intel podjęto decyzję o roz-podstawowych cech ogólnych obrazu. Można korzystaniem mocy obliczeniowej oraz pamięci, poczęciu rozwju biblioteki, której celem było-by usystematyzowanie znanych algorytmów z
Listing 2. Aplikacja odtwarzająca pliki wideo
dziedziny przetwarzania i analizy obrazów. Pro-
#include
jekt ten był częścią większego działania, mają-
#include
cego na celu popularyzację wykorzystania al-
int main(int argc, char *argv[])
gorytmów i technik wymagających dużej mo-
{
cy obliczeniowej.
IplImage* currentFrame;
Po upływie pewnego czasu, Intel zdecydo-
CvCapture* video;
wał się udostępnić projekt OpenCV społeczno-
char key;
ści. W roku 2006 ukazała się wersja 1.0 biblio-
if(argc != 2)
teki. Obecnie bliblioteka OpenCV dostępna jest
{
na licencji BSD, która pozwala na jej dowol-
printf("Uzycie: vid \n");
ne wykorzystanie, również w celach komer-
return 1;
cyjnych, bez konieczności upubliczaniania ko-
}
du źródłowego.
cvNamedWindow("Wideo", CV_WINDOW_AUTOSIZE);
Możliwości i algorytmy
//otwieramy plik wideo
Biblioteka OpenCV zawiera wiele algoryt-
video = cvCreateFileCapture(argv[1]);
mów, pozwalających na przetwarzanie obrazu
while(1) //główna pętla
oraz wydobywanie cech. Składa się z następu-
{
jących modułów:
//odczytujemy następną klatkę
currentFrame = cvQueryFrame(video);
ó CXCORE – podstawowa część biblioteki,
//czy to koniec pliku?
odpowiedzialna za definicje podstawowych
if(!currentFrame) break;
struktur i algorytmów, funkcje związane z
//wyświetlamy klatkę
rysowaniem figur oraz obsługę XML;
cvShowImage("Wideo", currentFrame);
ó CV – główna część biblioteki, zawierająca
//odpowiednia ilość FPS
algorytmy z dziedziny przetwarzania obra-
key = cvWaitKey(35);
zów oraz algorytmy wizyjne;
if(key == 27)
break;
ó MLL – część biblioteki odpowiedzialna za
}
funkcje klasy machine learning, między in-
cvReleaseImage(¤tFrame);
nymi klasyfikatory statystyczne;
cvReleaseCapture(&video);
ó HighGUI – część biblioteki odpowiedzial-
cvDestroyWindow("Wideo");
na za obsługę interfejsu użytkownika, ope-
return 0;
racje wejścia i wyjścia oraz obsługę plików
}
wideo i urządzeń wejściowych, takich jak
kamery.
60
październik 2009
www.lpmagazine.org
61
Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
Łącznie, biblioteka OpenCV zawiera ponad 500 bardzo często wykorzystywane są urządzenia nie- jesz uprawnieniami użytkownika root, możesz algorytmów z dziedziny systemów wizyjnych zgodne z architekturą x86. Biblioteka OpenCV, dokonać instalacji przy pomocy polecenia ma-oraz pokrewnych. Co więcej, dzięki zastoso- pomimo iż oficjalnie nie obsługuje takich urzą- ke install. Ostatnim krokiem jest wywołanie waniu technik machine learning oraz prostych dzeń, może zostać wykorzystana na wielu innych programu ldconfig.
sieci neuronowych, OpenCV stanowi świetną architekturach, w tym tzw. inteligentnych kame-
podstawę zarówno dla profesjonalnych syste- rach, zawierających zintegrowane mikroproceso- Pierwszy program w OpenCV
mów wizyjnych, badań naukowych, jak i ama- ry, umożliwiające realizację prostych zadań zwią- Zanim przejdziemy do dalszej części artykułu, torskich projektów.
zanych z wizją komputerową.
warto upewnić się, że biblioteka OpenCV została
Więcej informacji na temat możliwości zainstalowana poprawnie. W tym celu napiszemy
Obsługiwane architektury
uruchomienia programów wykorzystujących bi- prosty program, wczytujący obraz z pliku, doda-
W profesjonalnych systemach wizyjnych, w ce- bliotekę OpenCV na alternatywnych architektu- jący efekt rozmycia ( Gaussian Blur), a następnia lu przetwarzania danych pochodzących z kamery, rach, znajdziesz w internecie na stronach wy- wyświetlający obraz w oknie (Rysunek 1).
mienionych w ramce W Sieci.
Kod źródłowy programu znajduje się na Li-
Listing 3. Aplikacja wyświetlająca obraz z ka-
stingu 1. Jak widzisz, wszystkie operacje na ob-
mery internetowej
Instalacja
razie sprowadzają się do wywołania odpowied-
#include
Przejdźmy teraz do instalacji biblioteki nich funkcji. Przy wykorzystaniu OpenCV wy-
#include
OpenCV. Jest ona dostępna na stronie ht p: świetlenie nowego okna nie wymaga znajomo-
int main()
/ sourceforge.net/projects/opencvlibrary/. Pole- ści żadnych dodatkowych bibliotek.
{
cam Ci ściągnięcie wersji 1.1pre1 – jest to naj-
Nasz pierwszy program sprawdza, czy przy
IplImage* currentFrame;
nowsza, wspierana wersja biblioteki. Oczywi- wywołaniu została podana nazwa pliku do wy-
CvCapture* cam;
ście, możesz skorzystać z repozytoriów CVS świetlenienia – jeżeli nie, wyświetla odpowied-
char key;
– bardzo rzadko w dostępnych tam wersjach ni komunikat i kończy działanie. W przeciwnym
cvNamedWindow("Kamera", CV_
znajdują się błędy. My jednak dopiero zaczyna- przypadku, przy pomocy funkcji cvLoadIma-
WINDOW_AUTOSIZE);
my przygodę z biblioteką OpenCV, więc nie są ge() plik zostaje wczytany do struktury IplI-
nam potrzebne wszystkie nowości.
mage (powiemy o niej więcej za chwilę), służą-
//rozpoczynamy pobieranie
Zanim przejdziemy do właściwej instalacji cej do przechowywania informacji o obrazie.
obrazu z kamery
biblioteki OpenCV, warto upewnić się, że w na- Następnie, w celu wygładzenia obrazu, wywo-
cam = cvCreateCameraCapture(0
szym systemie zostały zainstalowane wszystkie łujemy funkcje cvSmooth(), podając, że chce-
);
niezbędne biblioteki, a wśród nich: gtk2+, libpng, my aby wygładzanie odbyło się przy użyciu me-
while(1) //główna pętla
libtiff, libjpeg, libjasper, zlib. Pamiętaj, że musisz tody Gaussa, na obszarze 3x3 pikseli.
{
dysponować pakietami w wersji dev – w prze-
Następnie, przy wykorzystaniu funkcji
//odczytujemy następną
ciwnym wypadku nie będzie możliwe ich wy- cvNamedWindow(), należącej do HighGUI, two-
klatkę
korzystanie przez OpenCV. Po zainstalowaniu rzymy nowe okno o rozmiarze automatycznie
currentFrame =
wszystkich niezbędnych pakietów (dokładną listę dopasowującym się do wyświetlanego obrazu
cvQueryFrame(cam);
znajdziesz na OpenCV Wiki), możesz przejść do (CV_WINDOW_AUTOSIZE). W HighGUI, etykieta
pobrania i instalacji biblioteki OpenCV.
wyświetlana na pasku tytułowym jest jednocze-
//wyświetlamy klatkę
Po pobraniu pliku z źródłami, wypakuj je śnie nazwą okna, którą wykorzystujemy w doty-
cvShowImage("Kamera",
do nowego katalogu za pomocą polecenia:
czących jej wywołaniach – z tego względu nie
currentFrame);
powinniśmy stosować w niej polskich znaków
//odpowiednia ilość FPS
tar -xvzf nazwa_archiwum.tar.gz
diakrytycznych. Po utworzeniu okna, wyświetla-
key = cvWaitKey(35);
my w nim obrazu, zapisany w strukturze IplI-
if(key == 27) break;
Następnie, po przejściu do katalogu z wypako- mage, przy użyciu funkcji cvShowImage().
}
wanymi danymi, wydaj polecenie: autoreconf
Program kończy pracę po naciśnięciu do-
-i --force. Dla zachowania porządku, bibliote- wolnego klawisza przez użytkownika, co reali-
cvReleaseImage(¤tFrame);
kę skompilujemy w nowym katalogu – w tym ce- zujemy za pomocą funkcji cvWaitKey(), któ-
cvReleaseCapture(&cam);
lu utworzymy nowy katalog za pomocą polecenia ra oczekuje na naciśnięcie klawisza, a następnie
cvDestroyWindow("Kamera");
mkdir install i z jego poziomu wydamy po- zwraca jego kod. Przed zakończeniem działania
return 0;
lecenie ../configure --prefix=/usr/local/. programu wywołujemy kolejno funkcje cvRe-
}
Zwróć uwagę na podsumowanie konfiguracji bi- leaseImage() i cvDestroyWindow(), zwalnia-
blioteki HighGUI, a szczególnie konfigurację in- jąc wykorzystywaną pamięć. Program kompilu-
Listing 4. Sposób wywołania funkcji cvSave-
terfejsu okien – niewykrycie biblioteki gtk2+ spo- jemy i linkujemy przy pomocy polecenia:
Image()
woduje, że wywołanie dowolnej funkcji związa-
#include
nej z obsługą okien zakończy się błędem. Warto g++ hw.cpp -o hw -I /usr/local/
// Do struktury img został
również sprawdzić, czy zostały wykryte zainsta- include/opencv -L /usr/local/lib -lm
wczytany odpowiedni obraz
lowane przez nas biblioteki graficzne.
-lcv -lhighgui -lcvaux
// ptr wskazuje na ciąg znaków
Jeżeli nie zauważysz żadnych nieprawidło-
– nazwę pliku docelowego
wości w wyniku działania skryptu configure, Jeżeli proces kompilacji zakończył się powo-
cvSaveImage(ptr, image);
możesz rozpocząć kompilacje przy użyciu pole- dzeniem, możesz uruchomić program przy po-
cenia make. Po jej zakończeniu, jeżeli dysponu- mocy polecenia: ./hw plik.jpeg.
60
październik 2009
www.lpmagazine.org
61
Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
Urządzenia wejściowe
wane przez bibliotekę OpenCV. Brak urządze- rowników w internecie (zakładając, że nie do-
Nasz pierwszy program działa bez zarzutów, nia na liście nie oznacza jednak, że nie będzie starcza ich producent).
zajmijmy się więc bardziej zaawansowanymi ono wspierane przez OpenCV.
Dla większości popularnych urządzeń zna-
aspektami wykorzystania biblioteki OpenCV.
Jeżeli wybrałeś jedno z popularnych urzą- nych firm dostępnych jest wiele szczegółowych
Najpierw jednak skonfigurujemy urządzenia, dzeń, to po podłączeniu sprzętu do komputera opisów instalacji. Niekiedy jednak możesz na-za pomocą których będziemy rejestrować ob- powienieneś już mieć możliwość rozpoczęcia trafić na znaczne problemy, szczególnie w przy-raz: kamery internetowe, karty frame grabber wykorzystania urządzenia w bibliotece OpenCV. padku kamer z dalekiego wschodu, których pro-lub kamery podłączone za pomocą interfejsu Działanie kamery internetowej możesz spraw- ducenci nie dbają o wsparcie produktu przez FireWire.
dzić przy użyciu aplikacji camorama, dostępnej systemy spod znaku pingwina.
na stronie ht p:/ camorama.fixedgear.org/. Jeżeli
Kamery internetowe
możesz zobaczyć obraz z kamery, to znaczy, że Kamery FireWire
Jednym z najczęściej stosowanych w ama- została ona poprawnie zainstalowana i jej wy- Oprócz standardowych kamer internetowych, torskich systemach wizyjnych urządzeń są korzystanie w bibliotece OpenCV nie powinno wykorzystujących interfejs USB, dostępne są zwykłe kamery internetowe. Ich niewąt- sprawiać najmniejszych problemów.
bardziej zaawansowane urządzenia, zazwyczaj
pliwą zaletą jest łatwość instalacji i obsłu-
Jeżeli moduł sterownika danej kamery nie korzystające z interfejsu FireWire.
gi, a także niska cena. Przed zakupem ko- zostaje wczytany automatycznie, oznacza to, że
W systemie Linux, obsługa urządzeń opar-
niecznie zapoznaj się jednak ze stroną http: nie ma go w systemie. Należy w takim razie od- tych na tym interfejsie odbywa się przy po-
//opencv.willowgarage.com/wiki/, na której czytać ID urządzenia przy pomocy polecenia mocy API video4linux (v4l). Więcej informa-znajduje się lista urządzeń, które są obsługi- lsusb, a następnie poszukać odpowiednich ste- cji na jego temat znajdziesz na stronie ht p:
/ linux.bytesex.org/v4l2/.
Listing 5. Funkcje wykorzystywane przy zapisywaniu plików wideo
CvVideoWriter*
Karty frame grabber
cvCreateVideoWriter(const char* filename, // nazwa pliku docelowego
W zastosowaniach profesjonalnych, bardzo czę-
int fourcc, // kod kodeku
sto spotyka się karty frame grabber, służące do
double fps, // liczba klatek na sekundę
konwertowania obrazu z postaci analogowej na
CvSize frame_size, // rozmiar klatki
cyfrową. W przeciwieństwie do kamer interne-
int is_color = 1); // czy kolorowy?
towych, w których obraz konwertowany jest
int cvWriteFrame(CvVideoWriter* writer, // wskaźnik do
przez urządzenie, karty frame grabber pozwala-
struktury CvVideoWriter
ją na uzyskanie znacznie lepszej jakości obrazu.
const IplImage* image); // obraz, który chcemy zapisać
Wynika to z faktu, iż kamery analogowe dyspo-
void cvReleaseVideoWriter(CvVideoWriter** writer); // wskaźnik na
nują znacznie lepszej jakości układami optycz-
wskaźnik do struktury CvVideoWriter
nymi, zaś sygnał jest konwertowany przy użyciu
wyspecjalizowanych układów scalonych.
Listing 6. Funkcje służąca do wydobywania krawędzi z obrazu
Obsługa kart frame grabber również odby-
IplImage* doCanny(IplImage* in, double lThresh, double hThresh)
wa się przy użyciu interfejsu video4linux. Dla
{
większości amatorskich zastosowań, wystarcza-
if(in->nChannels != 1)
jące okaże się zastosowanie standardowej karty
return NULL;
telewizyjnej jako urządzenia przychwytującego
IplImage* out = cvCreateImage(cvSize(in->width, in->height), IPL_
obraz z kamery.
DEPTH_8U, 1);
cvCanny(in, out, lThresh, hThresh);
Odtwarzanie plików wideo
Zanim przejdziemy do wyświetlania i transfor-
return out;
macji obrazu z kamery internetowej, napiszemy
}
program służący do odtwarzania plików wideo.
Kod programu znajduje się na Listingu 2.
Podobnie jak w pierwszym programie, zaczyna-
my od sprawdzenia liczby parametrów wywo-
łania. Następnie, otwieramy okno przy pomo-
cy funkcji cvNamedWindow() i otwieramy plik
wideo przy pomocy funkcji cvCreateFileCap-
ture(). Dostęp do pliku odbywa się poprzez
strukturę CvCapture, którą omówimy szerzej za
chwilę. Kolejne klatki pliku wideo pobieramy w
pętli przy użyciu funkcji cvQueryFrame(), za-
pisując je w już nam znanej strukturze IplIma-
ge, której zawartość wyświetlamy w oknie przy
użyciu funkcji cvShowImage(). Odpowiedni
odstęp czasowy pomiędzy poszczególnymi klat-
Rysunek 2. Skutek działania algorytmu Canny dla progów 100 oraz 150
kami zapewniamy przy użyciu funkcji cvWait-
62
październik 2009
www.lpmagazine.org
63
Programowanie
Programowanie
OpenCV – systemy wizyjne
OpenCV – systemy wizyjne
Key(), jako parametr podając liczbę milisekund. Zapisywanie plików wideo
popularniejszych, zwany Canny (od nazwiska
Odtwarzanie pliku wideo zostaje przerwane w Zapisywanie sekwencji obrazów do pliku jest twórcy).
momencie wyświetlenia ostatniej klatki pliku nieco bardziej skomplikowane. Wykorzystuje-
Listing 6 zawiera przykładową funkcję, ko-
lub po naciśnięciu klawisza [ ESC].
my w tym celu funkcje, których sposób wywo- rzystającą z algorytmu Canny w celu wydobycia
Zwróć uwagę, że każda pobrana klatka jest łania został przedstawiony na Listingu 5.
krawędzi z obrazu (Rysunek 2). W celu prawi-
przechowywana w strukturze IplImage, dzięki
Strukturą, która służy jako kontekst za- dłowego działania, przekazany obraz musi być
czemu możemy ją poddać dowolnym transfor- pisu wideo jest CvVideoWriter. Nowy kon- w skali szarości – odpowiednią konwersję pale-macjom, np. przy użyciu funkcji cvSmooth(). tekst zapisu pliku wideo tworzymy przy uży- ty kolorów możesz wykonać przy pomocy funk-Możemy również zapisywać wybrane klatki do ciu funkcji cvCreateVideoWriter(). Przy jej cji cvCvtColor(), której sposób zastosowania osobnych plików.
wywołaniu podajemy nazwę pliku w którym został opisany na OpenCV Wiki.
Jak zaraz się przekonasz, w bardzo podob- chcemy zapisywać kolejne klatki (filename),
ny sposób odbywa się odbieranie danych pocho- kod kodeku (fourcc), liczbę klatek na sekundę Co dalej?
dzących z kamery internetowej.
(fps), rozmiar pojedynczej klatki (frame_si- Jeżeli po przeczytaniu tego artykułu zaintereso-
ze) oraz określamy, czy nagrywana sekwen- wała Cię tematyka przekształceń i analizy obra-
Obsługa kamery
cja klatek jest kolorowa (is_color). Szczegól- zów przy wykorzystaniu biblioteki OpenCV, to
Zajmiemy się teraz obsługą obrazu pochodzą- nie duże znaczenie ma argument fourcc, prze- bardzo wiele ciekawych informacji znajdziesz cego z kamery internetowej. Wykorzystamy w chowujący kod kodeku – uzyskujemy go przy na stronach wymienionych w ramce W Sieci.
tym celu funkcje udostępniane przez HighGUI. użyciu makra CV_FOURCC, o składni przedsta- Szczególnie bogate w informacje są strony Wiki Kod przykładowego programu pobierające- wionej na Listingu 5. Jeżeli chcemy zapisać projektu OpenCV.
go obraz z kamery internetowej znajduje się na plik wideo przy użyciu kodeku MJPG ( Motion
Świadome wykorzystanie systemów wizyj-
Listingu 3. Z pewnością zauważasz duże podo- JPG), jako argument fourcc podajmy CV_FO- nych wymaga znajomości specyficznych roz-bieństwo do aplikacji wyświetlającej zawartość URCC('M','J','P','G').
wiązań, stosowanych w tej dziedzinie. Jeże-
pliku wideo. W celu przechowywania informa-
Zapis kolejnych klatek do pliku odbywa się li chciałbyś zapoznać się z przekształceniami
cji o źródle obrazu wykorzystywana jest ta sama przy pomocy funkcji cvWriteFrame(). Po za- obrazu od strony teoretycznej, to gorąco pole-struktura – CvCapture. Jedyną różnicę stanowi kończeniu zapisywania, należy zamknąć dostęp cam Ci zapoznanie się z literaturą z tej dziedzi-wykorzystanie funkcji cvCreateCameraCaptu- do pliku przy pomocy funkcji cvReleaseVide- ny. Trudno tu wskazać najlepsze tytuły, bowiem re(), powodującej rozpoczęcie pobierania ob- oWriter().
większość z nich nie została przetłumaczona na
razu z kamery, zamiast z pliku wideo. Jeżeli w
język polski.
systemie obecna jest jedna kamera, to w wywo- Przekształcenia obrazu
łaniu przekazujemy wartość 0, powodującą au- W naszym pierwszym programie, przedsta- Podsumowanie tomatyczne wykrycie odpowiedniego urządze- wionym na Listingu 1, wykorzystaliśmy pro- Tym sposobem dotarliśmy do końca artykułu.
nia wejściowego. Reszta kodu jest taka sama jak ste przekształcenie obrazu – wygładzanie meto- Mam nadzieję, że przekonałem Cię iż syste-w przypadku programu z Listingu 2.
dą Gaussa. Jest to bardzo przydatna funkcja, po- my wizyjne oraz techniki przetwarzania i trans-
zwalająca na usunięciu szumów z obrazu, mo- formacji obrazu mają bardzo duże znaczenie w
Zapisywanie obrazów i wideo
gących powodować błędne rozpoznanie cech.
wielu dziedzinach. Własnoręcznie wykorzysta-
Bardzo przydatną funkcją biblioteki OpenCV
Biblioteka OpenCV zawiera bardzo wiele łeś bibliotekę OpenCV w celu realizacji czę-
jest zapisywanie obrazów oraz ich sekwencji funkcji, pozwalających na modyfikację obrazu. ści z nich.
w plikach. Pokażemy teraz, jak zastosować te Nie będziemy tu ich opisywać, ponieważ są pro-
Nie traktuj tego artykułu jako pełnego
funkcje w naszych programach.
ste w wykorzystaniu – wszelkie niezbędne in- wprowadzenia do tematyki systemów wizyj-
formacje znajdziesz na stronach OpenCV Wiki. nych – jest to bardzo szeroka dziedzina, w któ-
Zapisywanie obrazów
Są tam również dostępne opisy podstawowych rej wiele trendów (szczególnie w zakresie wy-
Zapisywanie pojedynczych obrazów jest bardzo struktur, takich jak CvMat, CvPoint itp.
korzystywanego sprzętu) ulega szybkim zmia-
proste – wykorzystujemy w tym celu funkcję
nom. Dużą popularność zyskują obecnie sys-
cvSaveImage(), przyjmującą dwa parametry Detekcja krawędzi
temy wizyjne budowane w oparciu o układy
– wskaźnik do struktury IplImage oraz wskaź- Wykrywanie krawędzi jest jednym z podstawo- FPGA (ang. Field Programmable Gate Array) nik do ciągu znaków, określającego nazwę pli- wych problemów, których rozwiązanie jest kry- – pozwalające na bardzo szybką realizację na-ku, w którym chcesz zapisać obraz. Przykład tyczne z punktu widzenia systemów wizyjnych. wet bardzo złożonych algorytmów. Opis ich za-zastosowania funkcji cvSaveImage() został Istnieje wiele algorytmów, pozwalających na re- stosowania znacznie wykracza jednak poza te-przedstawiony na Listingu 4.
alizację tej funkcji – my omówimy jeden z naj- matykę tego artykułu.
W Sieci
O autorze
ó Strona projektu OpenCV – http://sourceforge.net/projects/opencvlibrary/
Autor interesuje się bezpieczeństwem sys-
ó Wiki OpenCV – http://opencv.willowgarage.com/wiki/
temów informatycznych, programowaniem,
ó Strona projektu video4linux – http://linux.bytesex.org/v4l2/
elektroniką, muzyką rockową, architekturą
ó Strona programu camorama – http://camorama.fixedgear.org/
mikroprocesorów oraz zastosowaniem Li-
ó Prosty program do detekcji twarzy, korzystający z Haar – http://nashruddin.com/
nuksa w systemach wbudowanych.
OpenCV_Face_Detection
Kontakt z autorem: rkulaga89@gmail.com
62
październik 2009
www.lpmagazine.org
63
Wyszukiwarka
Podobne podstrony:
2009 10 Programowanie przy uzyc Nieznany
2009 10 Jurassic Park Clonezill Nieznany
2009 10 Playing Fetch Building a Dedicated Download System with Rtorrent
2009 10 IMB ochrona przed korozja
EGZAMIN 2009 10
2009 10 27 Wstęp do SI [w 04]id&835
Serie (5) Zadan Trudnych 2009 10 Osekowski p5
2009 10 STATYSTYKA PARAMETRY Z PROBY
Historia 2009 10 etap rejonowy odp
K2 2009 10 zad 1
2009 10 Akwizycja i analiza pamięci
2009 10 Secret Stick a Usb Dongle for One Time Passwords
2 10 Wielkie odkrycia geografic Nieznany
E1 2009 10 zad 3
Zagadnienia Egz 2009 10
2009 10 Mousetraps
Ulotka logo 2009 10
więcej podobnych podstron