2009.10_OpenCV – systemy wizyjne_[Programowanie].pdf
(
698 KB
)
Pobierz
439033630 UNPDF
Programowanie
OpenCV – systemy wizyjne
– 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!
raz to większej liczby dziedzin życia jest nie-
unikniony. Wynika to nie tylko z wysokich kosz-
tów ludzkiej pracy, lecz również z ułomności na-
szych zmysłów – głównie wzroku i słuchu. Nie jesteśmy w
stanie zauważyć migotania diody jeżeli odbywa się ono ze
zbyt dużą częstotliwością, nasz zmysł wzroku reaguje na
bardzo ograniczoną szerokość pasma fal elektromagnetycz-
nych. Podobnie jest ze słuchem – nie słyszymy dźwięków o
bardzo wysokiej częstotliwości (powyżej 20 kHz – ultradź-
więków), ani drgań o niskiej częstotliwości (poniżej 20 Hz
– infradźwięków), mimo iż oddziaływują one bardzo nieko-
rzystnie na nasze zdrowie i samopoczucie.
Znacznie większe możliwości w tym zakresie daje nam
sprzęt elektroniczny. Rozmaite urządzenia pozwalają na reje-
strację zjawisk, które zachodzą bardzo szybko lub bardzo po-
woli, albo w ogóle nie są odbierane przez ludzkie zmysły. Nie
ulegają one zmęczeniu, mogą pracować w bardzo ciężkich
warunkach (pod warunkiem, że zostaną do nich odpowiednio
przystosowane) oraz, na dłuższą metę, są znacznie tańsze.
Niestety, okazuje się, że realizacja zadań charaktery-
stycznych dla ludzkiego mózgu za pomocą sprzętu elek-
tronicznego jest niezwykle trudna w realizacji. Wynika to
głównie z faktu, iż przetwarzanie w komórkach nerwowych
i mózgu odbywa się w sposób ogromnie zrównoleglony
– nie mamy nawet świadomości, jak potężnym i złożonym
narzędziem obliczeniowym jest nasz umysł.
W tym artykule zajmiemy się przechwytywaniem, prze-
twarzaniem oraz analizą obrazów. Z pewnością zauważysz,
że zastosowanie omawianych technik powoduje wiele po-
ważnych problemów natury technicznej. Sytuacja ulega jed-
nak systematycznej poprawie, wraz z postępami badań w
dziedzinach takich jak sztuczna inteligencja (sieci neurono-
we), cyfrowe przetwarzanie sygnałów (DSP) oraz przetwa-
rzanie równoległe. Techniki, których zastosowanie uprasz-
cza biblioteka OpenCV, znalazły swoje zastosowanie w inte-
ligentnych systemach uzbrojenia, przemyśle, robotyce, han-
dlu oraz systemach monitoringu.
Systemy wizyjne
Zanim przejdziemy do dalszej części artykułu, w której zaj-
miemy się praktyczną realizacją funkcji związanych z syste-
mami wizyjnymi przy użyciu biblioteki OpenCV, warto za-
dać sobie pytanie, czym tak naprawde są systemy wizyjne?
58
październik 2009
OpenCV
Ż
yjemy w czasach, gdy postęp automatyzacji co-
Programowanie
OpenCV – systemy wizyjne
Budowa systemu wizyjnego
Systemem wizyjnym nazywamy zespół urzą-
dzeń, wykorzystywanych w celu badania oto-
czenia w sposób podobny do tego, w jaki reali-
zowane jest to przez nasz mózg, tzn. przy pomo-
cy odbieranego światła. Typowy system wizyj-
ny składa się z następujących elementów:
tych oferowanych jako gotowe rozwiąza-
nia), element ten jest zbudowany w opar-
ciu o systemy wbudowane – dzięki po-
stępowi technologii wielordzeniowej we
współczesnych układach scalonych SoC
(ang.
System-on-Chip
), możliwa stała się
realizacja nawet bardzo skomplikowanych
algorytmów.
że być również inny, przetworzony obraz wraz
ze zbiorem dodatkowych danych (np. położe-
niem interesujących nas cech). Przykładem ta-
kiego zastosowania biblioteki OpenCV jest roz-
wiązanie zastosowane przez irmę Google w ce-
lu odpowiedniego dopasowania danych pocho-
dzących z systemu Google Maps do obrazów
satelitarnych, wykorzystywanych w programie
Google Earth.
Następnym przykładem są aplikacje gra-
iczne, w których algorytmy analizy i przetwa-
rzania obrazu wykorzystywane są do korekcji
zdjęć oraz nowoczesne interfejsy, pozwalające
na obsługę aplikacji przy użyciu gestów.
Coraz większe znaczenie zyskują również
pojazdy bezzałogowe, sterowane przy wykorzy-
staniu danych pochodzących z kamery. Bez ich
wykorzystania, niemożliwa byłaby eksploaracja
kosmosu, w tym większość misji mających na
celu badanie planety Mars. Możesz zastanawiać
się, dlaczego w takich przypadkach nie używa się
zdalnego sterowania, które jest przecież znacznie
bardziej niezawodne. Decyzja taka jest spowodo-
wana bardzo dużą odległością, którą fala elektro-
magnetyczna przebywa w czasie tak długim, iż
uniemożliwia to skuteczne sterowanie.
Bardzo ważną dziedziną, w której syste-
my wizyjne odnalazły swoje zastosowanie, jest
przemysł zbrojeniowy. Zaawansowane techniki
analizy, przetwarzania obrazu i rozpoznawania
cech, pozwalają na automatyczne naprowadza-
nie pocisków rakietowych tak, aby traiały do-
kładnie w cel. Odbywa się to poprzez budowę
modelu celu, a następnie jego odnajdywanie (za
pomocą odpowiednich algorytmów) w obrazie
pochodzącym z kamer.
• Urządzenia rejestrującego obraz
– w każ-
dym systemie wizyjnym musi znajdować
się urządzenie odpowiedzialne za rejestro-
wanie obrazu i przesyłanie go do urządzenia
przetwarzającego. W większości systemów
wizyjnych jest to kamera cyfrowa podłączo-
na za pomocą odpowiedniego interfejsu lub
karta frame grabber, służaca do przechwyty-
wania obrazu z urządzenia analogowego;
• Urządzenia przetwarzającego z odpowied-
nim oprogramowaniem
– często jest to
standardowy komputer PC z zainstalowa-
nym odpowiednim oprogramowaniem. W
części systemów wizyjnych (szczególnie
W większości przypadków, systemowi wizyj-
nemu towarzyszą dodatkowe urządzenia, takie
jak aktuatory, służące do zmiany stanu otocze-
nia. Niekiedy konieczne jest również zastoso-
wanie dodatkowych czujników (np. ultradźwię-
kowych czujników odległości) w celu zwięk-
szenia możliwości systemu wizyjnego lub za-
bezpieczeniem przed błędami, które mogłyby
być katastrofalne w skutkach.
Zastosowanie systemów
wizyjnych i przetwarzania obrazów
Systemy wizyjne oraz algorytmy przetwarzania
i analizy obrazów znajdują obecnie bardzo wiele
zastosowań. Warto jednak zastanowić się, jakie
możliwości daje ich zastosowanie, tzn. co mo-
żemy zrobić dalej z wynikami działania algoryt-
mów w nich wykorzystywanych?
Bardzo często, szczególnie w zastosowa-
niach przemysłowych, działanie systemu wizyj-
nego prowadzi do podjęcia konkretnej decyzji,
np.
sprawdzany produkt jest wadliwy
. Od osoby
projektującej system zależy, czym będzie skut-
kowała taka decyzja. W większości wdrożeń
przemysłowych, systemy wizyjne są dodatkowo
wspierane danymi pochodzącymi z czujników.
Efektem działania algorytmów wizyjnych mo-
Listing 1.
Pierwszy program korzystający z bi-
blioteki OpenCV
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int
main
(
int
argc
,
char
*
argv
[])
{
IplImage
*
img
;
if
(
argc
!=
2
)
{
printf
(
"Uzycie: hw <nazwa
pliku>\n"
);
return
1
;
}
//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
www.lpmagazine.org
59
Programowanie
OpenCV – systemy wizyjne
Problemy i ograniczenia
Niestety, szerokie zastosowanie systemów wi-
zyjnych nadal napotyka wiele problemów. Wy-
nikają one głównie z modelu przetwarzania da-
nych, wykorzystywanych we współczesnych
procesorach i mikrokontrolerach.
Jeżeli zastanowisz się chwilę nad większo-
ścią znanych Ci algorytmów, to z pewnością za-
uważysz, iż opierają się one na ściśle określo-
nym wykorzystaniu danych wejściowych w ce-
lu otrzymania ostatecznego wyniku. Wszyscy
znamy algorytmy takie jak sito Eratostenesa,
poszukiwanie największego wspólnego dziel-
nika dwóch liczb, czy chociażby sortowanie bą-
belkowe. Nie ulega wątpliwości, iż są one ści-
słe. Co więcej – jednym z podstawowych kryte-
riów poprawności każdego algorytmu jest wła-
śnie jego ścisłość i możliwość wielokrotnego za-
stosowania dla dowolnych danych wejściowych
(spełniających konkretne założenia).
W analizie obrazów trudno jest jednak
wskazać proste sposoby określania chociażby
podstawowych cech ogólnych obrazu. Można
to łatwo wytłumaczyć – czy znasz prosty sposób
ścisłego określenia wyglądu pingwina? Z pew-
nością nie. Szczególnie dużym problemem jest
fakt, iż nie chodzi to o opis typu:
dwie nogi, krót-
kie skrzydła, kolor czarno-biały
, lecz o określe-
nie matematycznych zależności pomiędzy po-
szczególnymi pikselami! Zwróć również uwa-
gę, że pingwin może przyjmować wiele póz,
może być częściowo zasłonięty, lub poprostu
może to być dwuwymiarowa fotograia. Widać,
że istnieje wiele problemów, z których część
wynika z samego faktu przedstawienia trójwy-
miarowego świata w postaci dwuwymiarowej
– wiadomo bowiem, że obiekt z przestrzeni trój-
wymiarowej może mieć, przynajmniej teore-
tycznie, nieskończenie wiele prawidłowych re-
prezentacji w przestrzeni dwuwymiarowej.
W celu rozwiązania tych problemów wy-
korzystuje się, oprócz standardowych algoryt-
mów, sieci neuronowe oraz inne, bardziej skom-
plikowane klasyikatory. Algorytmy z dziedziny
przetwarzania sygnałów cechują się dużym wy-
korzystaniem mocy obliczeniowej oraz pamięci,
co ogranicza ich wykorzystanie w aplikacjach
czasu rzeczywistego. Sieci neuronowe, pomimo
iż nie odzwierciedlają w sposób dokładny bu-
dowy ludzkiego mózgu, w wielu przypadkach
okazują się dobrym rozwiązaniem. Ich zastoso-
wanie wymaga czasochłonnego procesu ucze-
nia, jednak samo użycie w celu przetwarzania
danych jest już bardzo szybkie.
Biblioteka OpenCV
Własnoręczna implementacja algorytmów z
dziedziny przetwarzania i analizy obrazów mo-
że być bardzo trudna, szczególnie dla mniej do-
świadczonych programistów. W celu umożli-
wienia szerokiemu gronu użytkowników dostę-
pu do omawianych technik, została opracowa-
na biblioteka OpenCV, której zastosowanie jest
głównym tematem tego artykułu.
Historia biblioteki OpenCV
Historia biblioteki OpenCV sięga roku 1999,
kiedy to w irmie Intel podjęto decyzję o roz-
poczęciu rozwju biblioteki, której celem było-
by usystematyzowanie znanych algorytmów z
dziedziny przetwarzania i analizy obrazów. Pro-
jekt ten był częścią większego działania, mają-
cego na celu popularyzację wykorzystania al-
gorytmów i technik wymagających dużej mo-
cy obliczeniowej.
Po upływie pewnego czasu, Intel zdecydo-
wał się udostępnić projekt OpenCV społeczno-
ści. W roku 2006 ukazała się wersja 1.0 biblio-
teki. Obecnie bliblioteka OpenCV dostępna jest
na licencji BSD, która pozwala na jej dowol-
ne wykorzystanie, również w celach komer-
cyjnych, bez konieczności upubliczaniania ko-
du źródłowego.
Listing 2.
Aplikacja odtwarzająca pliki wideo
#include <stdio.h>
#include <highgui.h>
int
main
(
int
argc
,
char
*
argv
[])
{
IplImage
*
currentFrame
;
CvCapture
*
video
;
char
key
;
if
(
argc
!=
2
)
{
printf
(
"Uzycie: vid <nazwa pliku>\n"
);
return
1
;
}
cvNamedWindow
(
"Wideo"
,
CV_WINDOW_AUTOSIZE
);
//otwieramy plik wideo
video
=
cvCreateFileCapture
(
argv
[
1
]);
while
(
1
)
//główna pętla
{
//odczytujemy następną klatkę
currentFrame
=
cvQueryFrame
(
video
);
//czy to koniec pliku?
if
(
!
currentFrame
)
break
;
//wyświetlamy klatkę
cvShowImage
(
"Wideo"
,
currentFrame
);
//odpowiednia ilość FPS
key
=
cvWaitKey
(
35
);
if
(
key
==
27
)
break
;
}
cvReleaseImage
(
&
currentFrame
);
cvReleaseCapture
(
&
video
);
cvDestroyWindow
(
"Wideo"
);
return
0
;
}
Możliwości i algorytmy
Biblioteka OpenCV zawiera wiele algoryt-
mów, pozwalających na przetwarzanie obrazu
oraz wydobywanie cech. Składa się z następu-
jących modułów:
• CXCORE
– podstawowa część biblioteki,
odpowiedzialna za deinicje podstawowych
struktur i algorytmów, funkcje związane z
rysowaniem igur oraz obsługę XML;
• CV
– główna część biblioteki, zawierająca
algorytmy z dziedziny przetwarzania obra-
zów oraz algorytmy wizyjne;
• MLL
– część biblioteki odpowiedzialna za
funkcje klasy
machine learning
, między in-
nymi klasyikatory statystyczne;
• HighGUI
– część biblioteki odpowiedzial-
na za obsługę interfejsu użytkownika, ope-
racje wejścia i wyjścia oraz obsługę plików
wideo i urządzeń wejściowych, takich jak
kamery.
60
październik 2009
Programowanie
OpenCV – systemy wizyjne
Łącznie, biblioteka OpenCV zawiera ponad 500
algorytmów z dziedziny systemów wizyjnych
oraz pokrewnych. Co więcej, dzięki zastoso-
waniu technik
machine learning
oraz prostych
sieci neuronowych, OpenCV stanowi świetną
podstawę zarówno dla profesjonalnych syste-
mów wizyjnych, badań naukowych, jak i ama-
torskich projektów.
bardzo często wykorzystywane są urządzenia nie-
zgodne z architekturą x86. Biblioteka OpenCV,
pomimo iż oicjalnie nie obsługuje takich urzą-
dzeń, może zostać wykorzystana na wielu innych
architekturach, w tym tzw. inteligentnych kame-
rach, zawierających zintegrowane mikroproceso-
ry, umożliwiające realizację prostych zadań zwią-
zanych z wizją komputerową.
Więcej informacji na temat możliwości
uruchomienia programów wykorzystujących bi-
bliotekę OpenCV na alternatywnych architektu-
rach, znajdziesz w internecie na stronach wy-
mienionych w ramce
W Sieci.
jesz uprawnieniami użytkownika root, możesz
dokonać instalacji przy pomocy polecenia
ma-
ke install
. Ostatnim krokiem jest wywołanie
programu
ldconig
.
Pierwszy program w OpenCV
Zanim przejdziemy do dalszej części artykułu,
warto upewnić się, że biblioteka OpenCV została
zainstalowana poprawnie. W tym celu napiszemy
prosty program, wczytujący obraz z pliku, doda-
jący efekt rozmycia (
Gaussian Blur
), a następnia
wyświetlający obraz w oknie (Rysunek 1).
Kod źródłowy programu znajduje się na Li-
stingu 1. Jak widzisz, wszystkie operacje na ob-
razie sprowadzają się do wywołania odpowied-
nich funkcji. Przy wykorzystaniu OpenCV wy-
świetlenie nowego okna nie wymaga znajomo-
ści żadnych dodatkowych bibliotek.
Nasz pierwszy program sprawdza, czy przy
wywołaniu została podana nazwa pliku do wy-
świetlenienia – jeżeli nie, wyświetla odpowied-
ni komunikat i kończy działanie. W przeciwnym
przypadku, przy pomocy funkcji
cvLoadIma-
ge()
plik zostaje wczytany do struktury
IplI-
mage
(powiemy o niej więcej za chwilę), służą-
cej do przechowywania informacji o obrazie.
Następnie, w celu wygładzenia obrazu, wywo-
łujemy funkcje
cvSmooth()
, podając, że chce-
my aby wygładzanie odbyło się przy użyciu me-
tody Gaussa, na obszarze 3x3 pikseli.
Następnie, przy wykorzystaniu funkcji
cvNamedWindow()
, należącej do HighGUI, two-
rzymy nowe okno o rozmiarze automatycznie
dopasowującym się do wyświetlanego obrazu
(
CV_WINDOW_AUTOSIZE
). W HighGUI, etykieta
wyświetlana na pasku tytułowym jest jednocze-
śnie nazwą okna, którą wykorzystujemy w doty-
czących jej wywołaniach – z tego względu nie
powinniśmy stosować w niej polskich znaków
diakrytycznych. Po utworzeniu okna, wyświetla-
my w nim obrazu, zapisany w strukturze
IplI-
mage,
przy użyciu funkcji
cvShowImage()
.
Program kończy pracę po naciśnięciu do-
wolnego klawisza przez użytkownika, co reali-
zujemy za pomocą funkcji
cvWaitKey()
, któ-
ra oczekuje na naciśnięcie klawisza, a następnie
zwraca jego kod. Przed zakończeniem działania
programu wywołujemy kolejno funkcje
cvRe-
leaseImage()
i
cvDestroyWindow()
, zwalnia-
jąc wykorzystywaną pamięć. Program kompilu-
jemy i linkujemy przy pomocy polecenia:
Obsługiwane architektury
W profesjonalnych systemach wizyjnych, w ce-
lu przetwarzania danych pochodzących z kamery,
Listing 3.
Aplikacja wyświetlająca obraz z ka-
mery internetowej
#include <stdio.h>
#include <highgui.h>
int
main
()
{
IplImage
*
currentFrame
;
CvCapture
*
cam
;
char
key
;
cvNamedWindow
(
"Kamera"
,
CV_
WINDOW_AUTOSIZE
);
//rozpoczynamy pobieranie
obrazu z kamery
cam
=
cvCreateCameraCapture
(
0
);
while
(
1
)
//główna pętla
{
//odczytujemy następną
klatkę
currentFrame
=
cvQueryFrame
(
cam
);
//wyświetlamy klatkę
cvShowImage
(
"Kamera"
,
currentFrame
);
//odpowiednia ilość FPS
key
=
cvWaitKey
(
35
);
if
(
key
==
27
)
break
;
}
cvReleaseImage
(
&
currentFrame
);
cvReleaseCapture
(
&
cam
);
cvDestroyWindow
(
"Kamera"
);
return
0
;
}
Instalacja
Przejdźmy teraz do instalacji biblioteki
OpenCV. Jest ona dostępna na stronie
http:
//sourceforge.net/projects/opencvlibrary/
. Pole-
cam Ci ściągnięcie wersji
1.1pre1
– jest to naj-
nowsza, wspierana wersja biblioteki. Oczywi-
ście, możesz skorzystać z repozytoriów CVS
– bardzo rzadko w dostępnych tam wersjach
znajdują się błędy. My jednak dopiero zaczyna-
my przygodę z biblioteką OpenCV, więc nie są
nam potrzebne wszystkie nowości.
Zanim przejdziemy do właściwej instalacji
biblioteki OpenCV, warto upewnić się, że w na-
szym systemie zostały zainstalowane wszystkie
niezbędne biblioteki, a wśród nich: gtk2+, libpng,
libtiff, libjpeg, libjasper, zlib. Pamiętaj, że musisz
dysponować pakietami w wersji dev – w prze-
ciwnym wypadku nie będzie możliwe ich wy-
korzystanie przez OpenCV. Po zainstalowaniu
wszystkich niezbędnych pakietów (dokładną listę
znajdziesz na OpenCV Wiki), możesz przejść do
pobrania i instalacji biblioteki OpenCV.
Po pobraniu pliku z źródłami, wypakuj je
do nowego katalogu za pomocą polecenia:
tar -xvzf nazwa_archiwum.tar.gz
Następnie, po przejściu do katalogu z wypako-
wanymi danymi, wydaj polecenie:
autoreconf
-i --force
. Dla zachowania porządku, bibliote-
kę skompilujemy w nowym katalogu – w tym ce-
lu utworzymy nowy katalog za pomocą polecenia
mkdir install
i z jego poziomu wydamy po-
lecenie
../conigure --preix=/usr/local/
.
Zwróć uwagę na podsumowanie koniguracji bi-
blioteki HighGUI, a szczególnie konigurację in-
terfejsu okien – niewykrycie biblioteki gtk2+ spo-
woduje, że wywołanie dowolnej funkcji związa-
nej z obsługą okien zakończy się błędem. Warto
również sprawdzić, czy zostały wykryte zainsta-
lowane przez nas biblioteki graiczne.
Jeżeli nie zauważysz żadnych nieprawidło-
wości w wyniku działania skryptu
conigure
,
możesz rozpocząć kompilacje przy użyciu pole-
cenia
make
. Po jej zakończeniu, jeżeli dysponu-
Listing 4.
Sposób wywołania funkcji cvSave-
Image()
#include <highgui.h>
// Do struktury img został
wczytany odpowiedni obraz
// ptr wskazuje na ciąg znaków
– nazwę pliku docelowego
cvSaveImage
(
ptr
,
image
);
g++ hw.cpp -o hw -I /usr/local/
include/opencv -L /usr/local/lib -lm
-lcv -lhighgui -lcvaux
Jeżeli proces kompilacji zakończył się powo-
dzeniem, możesz uruchomić program przy po-
mocy polecenia:
./hw plik.jpeg
.
www.lpmagazine.org
61
Programowanie
OpenCV – systemy wizyjne
Urządzenia wejściowe
Nasz pierwszy program działa bez zarzutów,
zajmijmy się więc bardziej zaawansowanymi
aspektami wykorzystania biblioteki OpenCV.
Najpierw jednak skonigurujemy urządzenia,
za pomocą których będziemy rejestrować ob-
raz: kamery internetowe, karty frame grabber
lub kamery podłączone za pomocą interfejsu
FireWire.
wane przez bibliotekę OpenCV. Brak urządze-
nia na liście nie oznacza jednak, że nie będzie
ono wspierane przez OpenCV.
Jeżeli wybrałeś jedno z popularnych urzą-
dzeń, to po podłączeniu sprzętu do komputera
powienieneś już mieć możliwość rozpoczęcia
wykorzystania urządzenia w bibliotece OpenCV.
Działanie kamery internetowej możesz spraw-
dzić przy użyciu aplikacji camorama, dostępnej
na stronie
http://camorama.ixedgear.org/
. Jeżeli
możesz zobaczyć obraz z kamery, to znaczy, że
została ona poprawnie zainstalowana i jej wy-
korzystanie w bibliotece OpenCV nie powinno
sprawiać najmniejszych problemów.
Jeżeli moduł sterownika danej kamery nie
zostaje wczytany automatycznie, oznacza to, że
nie ma go w systemie. Należy w takim razie od-
czytać ID urządzenia przy pomocy polecenia
lsusb
, a następnie poszukać odpowiednich ste-
rowników w internecie (zakładając, że nie do-
starcza ich producent).
Dla większości popularnych urządzeń zna-
nych irm dostępnych jest wiele szczegółowych
opisów instalacji. Niekiedy jednak możesz na-
traić na znaczne problemy, szczególnie w przy-
padku kamer z dalekiego wschodu, których pro-
ducenci nie dbają o wsparcie produktu przez
systemy spod znaku pingwina.
Kamery internetowe
Jednym z najczęściej stosowanych w ama-
torskich systemach wizyjnych urządzeń są
zwykłe kamery internetowe. Ich niewąt-
pliwą zaletą jest łatwość instalacji i obsłu-
gi, a także niska cena. Przed zakupem ko-
niecznie zapoznaj się jednak ze stroną
http:
//opencv.willowgarage.com/wiki/
, na której
znajduje się lista urządzeń, które są obsługi-
Kamery FireWire
Oprócz standardowych kamer internetowych,
wykorzystujących interfejs USB, dostępne są
bardziej zaawansowane urządzenia, zazwyczaj
korzystające z interfejsu FireWire.
W systemie Linux, obsługa urządzeń opar-
tych na tym interfejsie odbywa się przy po-
mocy API video4linux (v4l). Więcej informa-
cji na jego temat znajdziesz na stronie
http:
//linux.bytesex.org/v4l2/
.
Listing 5.
Funkcje wykorzystywane przy zapisywaniu plików wideo
CvVideoWriter
*
cvCreateVideoWriter
(
const
char
*
ilename
,
// nazwa pliku docelowego
int
fourcc
,
// kod kodeku
double
fps
,
// liczba klatek na sekundę
CvSize
frame_size
,
// rozmiar klatki
int
is_color
=
1
);
// czy kolorowy?
int
cvWriteFrame
(
CvVideoWriter
*
writer
,
// wskaźnik do
struktury CvVideoWriter
const
IplImage
*
image
);
// obraz, który chcemy zapisać
void
cvReleaseVideoWriter
(
CvVideoWriter
**
writer
);
// wskaźnik na
wskaźnik do struktury CvVideoWriter
Karty frame grabber
W zastosowaniach profesjonalnych, bardzo czę-
sto spotyka się karty frame grabber, służące do
konwertowania obrazu z postaci analogowej na
cyfrową. W przeciwieństwie do kamer interne-
towych, w których obraz konwertowany jest
przez urządzenie, karty frame grabber pozwala-
ją na uzyskanie znacznie lepszej jakości obrazu.
Wynika to z faktu, iż kamery analogowe dyspo-
nują znacznie lepszej jakości układami optycz-
nymi, zaś sygnał jest konwertowany przy użyciu
wyspecjalizowanych układów scalonych.
Obsługa kart frame grabber również odby-
wa się przy użyciu interfejsu video4linux. Dla
większości amatorskich zastosowań, wystarcza-
jące okaże się zastosowanie standardowej karty
telewizyjnej jako urządzenia przychwytującego
obraz z kamery.
Listing 6.
Funkcje służąca do wydobywania krawędzi z obrazu
IplImage
*
doCanny
(
IplImage
*
in
,
double
lThresh
,
double
hThresh
)
{
if
(
in
->
nChannels
!=
1
)
return
NULL
;
IplImage
*
out
=
cvCreateImage
(
cvSize
(
in
->
width
,
in
->
height
),
IPL_
DEPTH_8U
,
1
);
cvCanny
(
in
,
out
,
lThresh
,
hThresh
);
Odtwarzanie plików wideo
Zanim przejdziemy do wyświetlania i transfor-
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-
kami zapewniamy przy użyciu funkcji
cvWait-
return
out
;
}
Rysunek 2.
Skutek działania algorytmu Canny dla progów 100 oraz 150
62
październik 2009
Plik z chomika:
SOLARIX33
Inne pliki z tego folderu:
2006.01_Koder plików w formacie OGG_[Programowanie].pdf
(722 KB)
2007.06_Piękno fraktali_[Programowanie].pdf
(1778 KB)
2008.11_GanttProject_[Programowanie].pdf
(1014 KB)
2007.04_USB Device Explorer_[Programowanie].pdf
(1134 KB)
2006.09_QT, PyQT – szybkie tworzenie baz danych_[Programowanie].pdf
(1319 KB)
Inne foldery tego chomika:
Administracja
Aktualnosci
Audio
Bazy Danych
Bezpieczenstwo
Zgłoś jeśli
naruszono regulamin