3. Adresárová štruktúra projektu
Zdrojový kód projektu SecureCam je organizovaný v jednoduchej adresárovej
štruktúre. Každý modul (na OS Windows dynamická knižnica .dll) má vlastný
podadresár projektového adresára „Source“. Niektoré súbory so zdrojovým
kódom obsahujúce globálne deklarácie alebo deklarácie tried výnimiek sú
spoločné pre všetky moduly. Tieto sa nachádzajú v podadresári „Shared“
adresára „Source“. Dokumentácia (Doc), externé knižnice (Libs), ukážkové videá
(Samples) s skompilované súbory (Build) majú vlastné adresáre v koreni
adresárovej štruktúry projektu tiež.
• SecureCam
o Build
o Doc
o Libs
o Samples
o Sounds
o Source
GUI
SecureCam
Security
Shared
StreamLoader
SystemLoader
VideoAnalyzer
Špeciality projektu
V jazyku C++ je veľmi ľahké vytvoriť únik pamäte (memory leak), pretože
behové prostredie neposkytuje garbage collection a každá naalokovaná pamäť
musí byť aj korektne dealokovaná. Aby sa predišlo podobným nepríjemnostiam,
tak sa na automatické uvoľňovanie alokovanej pamäte v zdrojovom kóde
používa logika smart pointrov. Implementáciu smart pointrov poskytuje
platformne nezávislá zbierka utilít a knižníc Boost, ktorej zdrojový kód je
dostupný pod Boost licenciou. Pre rýchly prístup k jednotlivým zdrojom videa
3
4. vzhľadom na ich ID využíva hash mapy (navrhovaný štandard tr1) z knižnice
boost.
Návrhové vzory
SecureCam využíva pomerne často vo svojom kóde implementácie
návrhových vzorov. Preto sa predpokladá, že čitateľ tohto dokumentu má aspoň
základný prehľad terminológie tejto oblasti. Základné návrhové vzory, ktoré
SecureCam využíva sú:
• Iterator
• Observer
• Factory method
• Abstract factory
• Command
• Visitor
Modularizácia
Každý modul je kompilovaný ako dynamická knižnica (.dll) operačného
systému Windows. Rozhranie modulov tvoria deklarácie interface-ov tried,
ktorých instancie vracia továreň na objekty známa z design patterns ako
(abstract) Factory. Každý modul má teda vlastnú továreň, pomocou ktorej
propaguje svoju funkčnosť iným modulom. V ďalšom texte bude aplikácia
SecureCam detailnejšie popísaná vzhľadom na jednotlivé moduly:
• GUI
• SecureCam
• Security
• Setup
• StreamLoader
4
5. • SystemLoader
• VideoAnalyzer
StreamLoader
SecureCam využíva pre prístup k zdrojom videa platformne nezávislú knižnicu
OpenCV vyvinutú firmou Intel, ktorá je určená najmä pre počítačové videnie
v reálnom čase. Zdrojový kód knižnice je dostupný pod licenciou BSD. Pre
efektívne využitie prítomnosti viacerých (jadier) procesorov využíva knižnicu pre
paralelné programovanie v jazyku C++ s názvom OpenMP. Základné triedy a ich
vlastnosti:
Obrázok 1 Diagram dedičnosti jednotlivých zdrojov videa.
• CameraVideoSource – podporuje všetky druhy kamier, ktoré sú
operačným systémom rozpoznané ako zdroj videa.
• FileVideoSource – podporuje všetky formáty videa, pre ktoré sú
nainštalované v operačnom systéme korektné video kodeky.
• BuffCameraVideoSource – je vstup z kamery, ktorého jednotlivé
snímky sa vkladajú do vyrovnávacieho buffera.
• BufferedFileVideoSource – je vstup z video súboru, ktorého jednotlivé
snímky sa vkladajú do vyrovnávacieho buffera.
5
6. Zápis videa podporuje aplikácia SecureCam tiž (trieda VideoWriter). Vlákna
jednotlivých video zdrojov sú implementované pomocou známeho platformne
nezávislého frameworku pre aplikácie a aplikačné rozhrania QT, ktorý bude ešte
spomenutá najmä v súvislosti s modulom GUI.
Obrázok 2 Enumerátor aktívnych zariadení.
• DeviceEnumerator – Metoda GetDeviceCount() vracia počet aktívnych
zariadení pre video v rozpoznaných operačným systémom. Pre zistenie
prítomnosti zariadení opäť využíva knižnicu OpenCV.
Továreň modulu StreamLoader poskytuje konštrukciu všetkých spomenutých
tried.
Obrázok 3 Továreň modulu StreamLoader.
6
7. VideoAnalyzer
Továreň na objekty poskytuje instancie potomkov troch abstraktných tried,
z ktorých je modul pre spracovanie videa vytvorený: filtrátor videa, obrazový
filter a detektor:
Obrázok 4 Továreň modulu VideoAnalyzer.
Obrazový filter
Každý filter podporuje množstvo parametrov, aby boli maximálne
prispôsobiteľné vlastnostiam vstupného videa a zachytenej scény ale aj
potrebám užívateľa. Kód každého filtru do veľkej miery využíva funkcie
spomínanej knižnice OpenCV.
7
8. Obrázok 5 Diagram dedičnosti dvoch obrazových filtrov.
Detektor
Detektor je špeciálnym obrazovým filtrom, ktorý okrem zmeny obrazu (nie je
však nutná) dokáže zasielať poplašnému systému správy (metóda SendEvent).
V prípade poplašného syst
systému sa jedná o správy typu štart / stop poplach. Pre
potreby aplikácie SecureCam stačí jediný detektor WhiteDetector.
Obrázok 6 Diagram dedičnosti detektora.
8
9. Filtrátor videa
Obrázok 7 Diagram dedičnosti filtrátora videa.
Pracuje s vektorom obrazových filtrov, do ktorého je možné jednotlivé
obrazové filtre v ľubovoľnom čase pridávať (metóda AddImageFilter) a takisto aj
odoberať (metóda RemoveImageFilter). Na vstupné video aplikuje postupne
všetky filtre vo vektore obrazových filtrov.
Výsledný filtrovaný obraz potom zasiela všetkým príjemcom, ktorý sú u neho
zaregistrovaný (metódy AddVideoStreamAcceptor,
RemoveVideoStreamAcceptor, SetPrimaryAcceptor).
Táto logika je implementáciou návrhového vzoru „Observer“ a umožňuje
synchrónne rozosielať jednotlivé spracované snímky všetkým zaregistrovaným
príjemcom bez nutnosti aktívneho čakania príjemcov.
Poslednou funkčnosťou filtrátora je možnosť zvoliť si aký obraz bude
príjemcom rozoslaný po aplikovaní všetkých obrazových filtrov vo vektore
(metóda SetOutput). Môže to byť pôvodný (vstupný) obraz, filtrovaný obraz
a spojený obraz. Ten je zlúčením pôvodného (vstupného) obrazu a filtrovaného
obrazu vo jednom farebnom kanále.
Filtrátor Poplašný systém
Filtrátor
Zobrazenie v GUI
Vstupný
obraz
Zápis videa
9
Obrázok 8 Filtrovanie a distribúcia vstupného obrazu pomocou filtrátorov
10. Ako je vidieť na obrázku 16, filtrátorov môže byť použitých aj viac, tým pádom
je možné distribuovať rôzne výstupy rôznym príjemcom videa.
SecureCam
Obrázok 9 Diagram dedičnosti poplašného systému.
Základná myšlienka kódu tohto modulu spočíva vo využití návrhového vzoru
„Command“, pomocou ktorého je možné zasielaním príkazov vo forme objektov
(IEvent) z ostatných modulov ovládať celý poplašný systém (OnEvent
a ProcessSelf).
Udalosti a Logovanie
Obrázok 10 Udalosti Start a End Alarm.
Každá udalosť (príkaz), ktorú predstavujú instancie implementácie
návrhového vzoru „Command“, pomocou ktorých je poplašný systém riadený, je
zaznamenávaná formou logu, ktorý je tvorený dvojicami: dátum a čas, názov
10
11. udalosti (príkazu). Interface pre zapisovanie logu poskytuje modul SystemLoader
so svojim ILogWriter.
Poplach
SecureCam podporuje niekoľko typov (prejavov) poplachu: hlásenie poplachu
zvukom (počas poplachu je opakovane prehrávaný zvolený zvukový súbor),
nahrávanie videa (na HDD sa začne zapisovať vstupné video (IVideoWriter), ktoré
spôsobuje poplach) a zaslanie notifikačného e-mailu, ktoré je realizované
pomocou externej aplikácie (je súčasťou dodávky) s voľnou licenciou
(sendEmail.exe).
Modul SecureCam teda poskytuje len abstrakciu poplašného systému
(ISecuritySystem) riadeného príkazmi a abstrakciu vstupu poplašného systému
(ISecurityInput), ktorý je zapuzdruje triedy IVideoSource a IVideoStreamFiltrator
modulu VideoAnalyzer.
Obrázok 11 Továreň modulu SecureCam.
Security
Poskytuje modulu poplašného systému bezpečnú správu hesiel. To znamená,
že heslá sú interne reprezentované 32 bajtovým reťazcom šifrovaného metódou
MD5. Tento modul používa implementáciu šifrovania od RSA Data Security.
11
12. Obrázok 12 Továreň a jediná vyrábaná trieda (IPassword).
XML
Transformuje zostavy poplašného systému (identifikácia zdrojov videa,
obrazové filtre, heslo a iné nastavenia systému) do a z formátu XML. Využíva pri
tom externú knižnicu Tiny XML c++.
Tento modul implementuje tri I/O triedy, ktorých interface má lan jednu
metódu Write/Read a každá z nich jeden parameter (ISecuritySystem).
IXMLWritel uloží na dané miesto zostavu poplašného systému vo formáte XML.
IXMLReader vytvorí poplašný systém, ktorého zostava je uložená vo formáte
XML na danom mieste. ILogWriter uloží záznamy logu poplašnéh systému na
dané miesto vo formáte XML.
Obrázok 13 Tri I/O triedy modulu SystemLoader.
XML modul jednoducho ukladá, resp. nahráva zostavu poplašného systému
do, resp. zo súboru na HDD. Hierarchia uložených dát (zostavy) je stromovitá, ako
je vidieť aj na nasledujúcom obrázku.
12
13. Obrazový filter
Obrazový filter
Zdroj videa
Obrazový filter
Poplašný systém Zdroj videa
Obrazový filter
Zdroj videa Obrazový filter
Obrazový filter
Obrázok 14 Štruktúra reprezentácie zostavy poplašného systému
GUI
Mal by byť modulom, ktorý sa stará nielen o vizuálnu stránku projektu, ale aj
o komfortné používanie celého poplašného systému. Vďaka platformne
nezávislému frameworku pre aplikácie a aplikačné rozhrania Qt, naplnil modul
GUI obe požiadavky relatívne jednoducho. Celý framework je postavený na
architektúre riadenej udalosťami. Zabezpečuje aj množstvo iných platformne
nezávislých utilít (podpora vlákien, synchronizácia vlákien, grafika, štandardné
dialogy...), ktoré aplikácia SecureCam úspešne využíva.
Obrázok 15 Hlavné okno aplikácie - SCMainWindow.
13
14. Hlavné okno aplikácie je rozdelené do troch vizuálnych oblastí, ktoré sú vďaka
dokovaniu jednoducho premiestniteľné v rámci hlavného okna.
Reprezentácia v kóde
Každé dialógové okno, widget ale aj hlavné okno aplikácie sú reprezentované
samostatnou triedou, ktorej predka generuje nástrok frameworku Qt „qmake“.
Ten z xml súborov vyjadrujúcich rozloženie, názvy, signály a sloty jednotlivých
ovládacích prvkov vygeneruje kód v jazyku C++.
Obrázok 16 Diagram dedičnosti troch tried modulu GUI.
Obrázok 17 class DialogCameras.
14
15. Obrázok 18 class DialogSystemProps.
Obrázok 19 class DialogFilters.
Obrázok 20 class DialogInputProps.
Setup
Na vytvorenie spoľahlivého inštalátora projektu SecureCam, bol použitý
nástroj Inno Setup. Preto je tento modul zastúpený len jedným vstupným
skriptom, ktorý nástroj Inno setup kompiluje do spustiteľného súboru.
15
16. Kompilácia SecureCam
Pre úspešné skompilovanie aplikácie SecureCam je nutná prítomnosť
niekoľkých knižníc alebo nástrojov. Verzie jednotlivých knižníc / nástrojov ktoré
aplikácia aktuálne využíva sú uvedené v súbore Doc/VERSIONS.txt. Pre
skompilovanie GUI modulu je nutné pregenerovať GUI.vcproj súbor príkazom
qmake v adresári modulu GUI, aby bol prispôsobený na dané prostredie (cesty
a verzia knižnice Qt).
Boost – Zdrojové kódy knižnice sa nachádzajú na adrese
http://www.boost.org. Knižnicu samotnú nie je nutné kompilovať, keďže väčšina
súborov sú hlavičkové súbory.
OpenCV – Inštalátor behového prostredia a zdrojových kódov sa nachádzajú
na adrese http://sourceforge.net/projects/opencvlibrary/.
Qt – SDK známeho frameworku je možné stiahnuť pod duálnou licenciou na
adrese http://www.qtsoftware.com.
Inno Setup – Free nástroj pre kompiláciu inštalačného skriptu je možné nájsť
na adrese http://www.jrsoftware.org/isinfo.php.
16