2009 10 OpenCV systemy wizyjn Nieznany


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