Bakalářská práce
2006
Tomáš Satinský
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně pod vedením Ing. Jana Pačivy Uvedl jsem všechny literární prameny a publikace, ze kterých jsem čerpal.
V Brně dne 26.4.2006
Tomáš Satinský
Abstrakt Tato práce se zabývá návrhem a realizací programu pro tvorbu vizuálního doprovodu k hudbě. Oním vizuálním doprovodem k hudbě se rozumí obraz měnící se v čase, který je promítán na plátno na kulturních akcích jako jsou vystoupení kapel a dýdžejů. Dotváří tak scénu, na které vystoupení probíhá. Program, který je výsledkem této práce jej umožňuje vytvářet v reálném čase. Architektura programu je navržena pomocí objektově orientovaného přístupu. Vstupy programu jsou obrázky, videosoubory a obraz z kamery. Ty jsou v programu upravovány a kombinovány. Dalším vstupem je audiosignál sloužící k modulování a generování obrazu. Nejvýraznějším rysem uživatelského rozhraní je použití virtuálních zařízení pro zpracování obrazu, které je možno propojovat. Uživatel tak získá vysokou flexibilitu programu, která je ještě podpořena možností přidávat další virtuální zařízení jako moduly programu. Navržen je jako přenositelný mezi operačními systémy Windows a Linux. Implementován je na OS Windows. Klíčová slova: VJ, VJing, vizualizace, FFMPEG, OpenGL, Qt, FMOD, OpenCV
Abstract This work considers by design and realization of program for composing visual entourage to music. This visual entourage mean picture changing in time, wich is projected to canvas on cultural events as band performance a DJ shows. Put the finishing touch to performance in progress. This program make possible to create it in real-time. Program architecture is designed by object oriented way. Inputs are: pictures, videos a videosignal from camera. Those can be edited and combined. Next input is audiosignal for picture generating and modulating. User interface uses virtual devices for picture processing, wich can be connect trough. User acquire flexible program with possibility to add new virtual devices as plugins. Is designed as portable between operation systems Windows a Linux. Implemented is on OS Windows. Key Words: VJ, VJing, visualization, FFMPEG, OpenGL, Qt, FMOD, OpenCV
Obsah 1 Úvod 2 Specifikace programu 2.1 Multimediální vstupy programu 2.2 Výstup programu 2.3 Úpravy a mixování videosignálu 2.4 Uživatelské rozhraní 2.5 Modularita 2.6 Kód programu a přenositelnost 2.7 Nároky na hardware 2.8 Distribuce a licence 3 Použité programové prostředky 3.1 GNU C++ 3.2 Sada nástrojů Qt 3.2.1 Modul pro tvorbu uživatelských rozhraní 3.2.2 Modul OpenGL 3.2.3 Systém signálů a slotů 3.2.4 Podpora projektů 3.2.5 Systém zásuvných modulů a dynamických knihoven 3.3 Knihovna OpenGL 3.4 Knihovna FFMPEG 3.5 Knihovna OpenCV 3.6 Knihovna FMOD 4 Návrh programu 4.1 Uživatelské rozhraní 4.2 Architektura programu 5 Výsledný program 5.1 Struktura adresářů, spuštění, kompilace 5.2 Uživatelské rozhraní, ovládání 5.3 Implementovaná virtuální zařízení 5.4 Tvorba nových modulů 5.4.1 Třída nového virtuálního zařízení 5.4.2 Třída nového modulu 5.4.3 Projektový soubor modulu 5.5 Výsledky testování 6 Závěr 7 Literatura 8 Přílohy 8.1 Licence OpenCV 8.2 Data na CD
1 Úvod Cílem této práce je navrhnout a zhodnotit program pro tvorbu a mixování vizuálního doprovodu k hudbě. Vizuálním doprovodem k hudbě je myšlen obraz měnící se v čase, který je promítán na plátno na vystoupeních kapel a dýdžejů. Může být promítán i na stěny či objekty zavěšené ve vzduchu. Doplňuje se tedy s dalšími prostředky pro zpestření scény jako je barevná hudba a jiné světelné a kouřové efekty. Nabývá na důležitosti hlavně na scéně elektronické hudby, kde často schází výrazný prvek živě hrajících interpretů. Vizuální doprovod k hudbě bude dále nazýván vizualizací. Vizualizace může být předem připravená nebo tvořena v reálném čase tvůrčí osobou nejčastěji nazývanou VJ (z anglického Video Jockey, čte se „vídžej“), samotné tvorbě se říká VJing(„vídžejing“). Tvorba vizualizace vychází z předem připravených obrázků, videjí a obrazů z videokamery, která je umístěna přímo na konkrétní kulturní akci. VJ tedy musí disponovat prostředky, jenž mu umožní tyto vstupy kreativně zpracovávat a kombinovat. V dnešní době bývá tímto prostředkem především osobní počítač vybavený potřebným softwarem. Již mnoho let disponují počítače dostatečným výkonem při zpracování multimédii a tak je spojení PC a potřebného programu levnou a efektivní variantou. Právě dostupnost prostředků na bázi PC umožnila rozvoj tohoto oboru. Program, který bude výsledkem této práce tedy umožní vytvářet vizualizace v reálném čase přímo na místě kulturní akce, či jen tak pro zábavu kdekoli jinde. Existovala a existují i jiná řešení používající speciální hardwarové prostředky pro kombinování obrazu z videií, videokamer či speciálních DVD přehrávačů, ale tyto se uplatňují v menší míře a jsou finančně mnohem náročnější. Struktura tohoto dokumentu. Tématem této práce není nějaké obecné téma, ale úkol vytvořit konkrétní program. Tento dokument je koncipován jako záznam životního cyklu daného programu od specifikace přes návrh až po zhodnocení vytvořeného aplikace. Druhá kapitola se zabývá specifikací, tedy obecnými požadavky které klademe na výsledný program. Jelikož program se skládá z několika poměrně komplikovaných součástí, je zcela nezbytné použít předem připravené nástroje a knihovny, které umožní vytvořit funkční program v odpovídajícím časovém intervalu. Vybranými prostředky se zabývá třetí kapitola. Čtvrtá kapitola je návrhem programu. Důraz je kladen na uživatelské rozhraní, prostřednictvím kterého probíhá interakce mezi programem a uživatelem. Dále je navržena architektura programu udávající vnitřní dělení, uspořádání a principy činnosti programu. Jak bylo zmíněno, je cílem této práce také vytvoření funkčního programu. Pátá kapitola se zabývá hodnocením procesu tvorby i hotového díla. Následuje závěr, použitá literatura a přílohy.
Strana 1.
2 Specifikace programu 2.1 Multimediální vstupy programu Hlavními vstupy programu by měly být: obrázky a videa uložené v počítači, obraz z připojených kamer a zvukový signál. U obrázku je důraz kladen na rastrové formáty. Hlavně by mělo být podporováno načítání obrázků typů PNG(Portable Network Graphics), BMP a JPEG(Joint Photographic Experts Group). Rozhraní by mělo poskytovat náhled u jednotlivě otvíraných souborů. U video-souborů musí být možné otevření a přehrávání několika soborů zároveň. Náhled by měl být rovněž k dispozici. Mezi podporovanými formáty by měly být hlavně sobory komprimované metodou MPEG(Moving Picture Experts Group). Dále je zde externí zvukový signál přijímaný prostřednictvím zvukové karty z mikrofonu nebo přímo ze zvukové aparatury daného představení. Ten nalezne uplatnění při tvorbě obrazu přímo v programu. Takto se nejčastěji tvoří obraz abstraktního charakteru. Program by měl umožňovat tvorbu alespoň jednoho abstraktního obrazu na základě této zvukové složky. Výhodná by byla také možnost modulovat obraz na podle této zvukové složky (například jas podle amplitudy). Velmi důležitým vstupem je obraz z připojených kamer. Program by měl umožňovat jeho využití se zachováním kvality obrazu a snímkovací frekvence.
2.2 Výstup programu Výstupem je obraz kombinující použité vstupy a generovaný obraz za použití různých způsobů směšování a filtrace obrazu. Je tvořen v reálném čase. Program musí být schopen zachovat vysokou rychlost snímkování (min. 20 snímků za sekundu) i v případě přehrávání a úpravy několika videí, obrázků a obrazů z kamery. Pokud se má program uplatnit v praxi, musí zde existovat možnost výstupu obrazu na jiný než primární obrazový výstup počítače. V současné době disponují i levné grafické karty kromě běžného výstupu na monitor ještě minimálně jedním dalším S-video výstupem nebo digitálním výstupem na LCD, na který je možno připojit projektor. Právě tento by měl být použit pro hlavní obrazový výstup programu.
2.3 Úpravy a mixování videosignálu Existují dvě základní operace s obrazem, kterými bude výsledný program disponovat. Je to úprava obrazu(např. změna kontrastu) a slučování dvou obrazů do jednoho(např. prolínání). Možná je i kombinace obou dvou typů operací. Úpravy, které by měly být k dispozici: • Změna jasu a kontrastu • Transformace – posunutí, rotace, zmenšení/zvětšení a deformace obrazu Požadované typy slučování: • Jednoduché prolínání • Kombinace s matematickou operací(např. sečtení jasových složek obrazů) • Sloučení s trojrozměrným efektem pro demonstraci možností 3D grafiky.
Strana 2.
2.4 Uživatelské rozhraní Zcela zásadní roli hraje v podobných programech uživatelské rozhraní. Uživatelské rozhraní mnoha podobných programů z nich dělá jednoúčelově zaměřené a neflexibilní nástroje. S lepším uživatelským rozhraním by byl jejich potenciál mnohem větší. Musí být intuitivní, přehledné a jednoduché. Zároveň však nesmí uživatele omezovat. A právě to je největší výzvou - navrhnout program s uživatelským rozhraním, které dokáže plně využít možnosti programu i tvůrce. Důraz je kladen na následující: jestliže program disponuje možností určitých úprav a kombinování obrazů, pak musí umožnit uživateli tato prostředky libovolně kombinovat. To je handicap mnoha existujících programů. Nabízí například řadu filtrů a kombinátorů obrazu ale použít lze vždy jen jeden. Kombinace jsou nemožné.
2.5 Modularita Je velmi pravděpodobné, že se najdou uživatelé, kteří nejsou zcela spokojeni s možnostmi, které program nabízí. To se právě v případě programu tohoto typu děje až podezřele často. Není výjimkou situace, kdy si skupiny zabývající se tvorbou audiovizuálního obsahu vyvíjejí každá svůj program takříkajíc „na míru“. Komerční či volně šířitelné produkty jim jednoduše neposkytují požadovanou funkčnost. Jak zajistit aby se daný software nestal jen dalším programem „na míru tvůtci“? Je možné si povšimnout, že velice úspěšnými se stávají programy umožňující rozšíření pomocí zásuvných modulů. Funkčnost programu je pak možno snadno rozšiřovat. Každý aktivnější uživatel pomocí modulu přidá to, co mu v programu chybí. Pokusím se vyhovět tomuto požadavku a umožnit uživateli vytvořit či stáhnout z internetu modul, který doplní program o potřebnou funkcionalitu. Důkazem o vhodnosti tohoto přístupu jsou například programy: Firefox, Winamp či Miranda, pro něž existují snad stovky rozšíření formou modulů.
2.6 Kód programu a přenositelnost Program by měl být napsán s objektově orientovaným přístupem a měl by být přenositelný. Přenositelností se myslí schopnost programu fungovat pod více operačními systémy. Hlavním důraz je kladen na nejrozšířenější operační systémy Windows a Linux. Na Windows pracuje většina současných uživatelů. Komunita okolo Linuxu zase disponuje lidmi ochotnými spolupracovat na cizích projektech. Podporou operačního systému Linux se tedy zvyšuje počet potenciálních tvůrců přídavných modulů.
2.7 Nároky na hardware Program by měl být plně funkční na jakémkoli multimediálním počítači. Nutná je zvláště přítomnost grafického akcelerátoru v systému. Minimální parametry počítače, který zajistí plnou funkčnost programu: • procesor 1 Ghz • grafická karta ekvivalentní s nVidia Riva TNT2 • 256 MB operační paměti
Strana 3.
2.8 Distribuce a licence Program bude distribuován jako volně šiřitelný – tedy zdarma a s přístupným zdrojovým kódem. Vyhovující je často používaná licence GPL(verze 2) vytvořená Free Software Foundation. Základní vlastnosti které musí splňovat software distribuovaný pod licencí GPL • je zdarma dostupný všem uživatelům včetně zdrojového kódu • kdokoli jej může šířit i za poplatek • jiný program založený na tomto programu (např. používající část zdojového kódu) musí být opět šířen pod touto licencí.
Strana 4.
3 Použité programové prostředky Tato kapitola se zabývá všemi programy či knihovnami, které budou použity při tvorbě programu. Při tvorbě programu bude třeba vyřešit řadu problémů. Použití dostupných knihoven a nástrojů umožňuje rychlejší postup v práci. Další výhodou je, že knihovny bývají dobře otestované uživateli, kteří je používali před námi. Oblasti které je takto třeba pokrýt jsou hlavně: Grafické uživatelské rozhraní, modularita, načítání videí a obrázků, přístup k pokročilým funkcím grafické karty, vstup videosignálu z kamery a vstup audiosignálu prostřednictvím zvukové karty. To vše se splněním podmínky přenositelnosti, což situaci dále komplikuje.
3.0 GNU C++ Pro programování projektu byl vybrán objektově orientovaný přístup(OOP). Nejpoužívanějším objektově orientovaným jazykem je C++, který v sobě zahrnuje programovací jazyk C. V důsledku značného rozšíření existuje mnoho knihoven pro tyto jazyky. V případě volby jiného jazyka by byl výběr knihoven podstatně menší. Zvoleno tedy bylo C++ a to také proto, že právě s tímto programovacím jazykem má autor programu největší zkušenosti. Jako kompilátor C++ byl zvolen GNU C++. Hlavním důvodem je, že tento existuje ve stejné podobě na mnoha operačních systémech včetně Windows s Linux, na které je podle specifikace kladen důraz. Jeho použití je zdarma.
3.1 Sada nástrojů Qt Sada nástrojů (toolkit) Qt je produktem firmy Trolltech. Ta při distribuci Qt používá takzvaný duální model. To znamená, že Qt je dodáváno ve dvou hlavních verzích – komerční a open-source. Každá z verzí má vlastní licenční ujednání. Pro tento projekt je důležitá zejména open-source verze. Její použití se řídí podmínkami licence GPL, což vyhovuje tomuto projektu, který bude šířen pod stejnou licencí. Duální model firmě poskytuje jak potřebné finanční zajištěni nutné k existenci stálého týmu, tak spoluúčast členů open-source komunity na testování. Na knihovně Qt je založen například okenní systém Linuxu - KDE. Testování je tedy opravdu důkladné. Qt je přenositelné - poskytuje identickou funkčnost na platformách Windows, Linux, UNIX a Macintosh. Současná open-source verze 4.0.1 obsahuje tyto součásti: • Modul jádra (QtCore). Ten obsahuje: • Základní datové typy a soubor tříd kontejnerů a iterátorů • Třídy pro víceváknové programování • Třídy pro časování • Systém zásuvných modulů • Systém slotů a signálů • Modul pro tvorbu uživatelských rozhraní(QtGui) • OpenGL modul(QtOpengl) • Modul pro práci v síti(QtNetwork) • XML modul(QtXml) • Databázový modul(QtSql) • Podporu projektů • Editor uživatelských rozhraní - Qt Designer • Nástroj pro podporu více jazyků v programech – Qt Linguist • Obsáhlá kolekce příkladů použití • Podrobná dokumentace • Zdrojový kód všech součástí
Strana 5.
Jak se vidno, Qt pokrývá mnoho oblastí. Prakticky všechny součásti toolkitu jsou provázány. Uživatelské rozhraní používá datové typy a kontejnery Qt. OpenGL je možno použít v součinnosti s uživatelským rozhraním. Komunikace mezi prvky GUI může probíhat pomocí slotů a signálů atd. Z toho důvodu je vhodné použít prostředky Qt všude, kde je to možné a vhodné. Vyhneme se tak zbytečným konverzím dat a „zůstaneme uvnitř“ léta testovaného a prověřeného systému. Tomu bude učiněno za dost a toolkit Qt se stane základem této aplikace. Popsány budou použité součásti.
3.1.1 Modul pro tvorbu uživatelských rozhraní K dispozici jsou prakticky všechny základní i složitější ovládací prvky formou tříd. Z těch je možné odvozovat vlastní typy s rozšířenou funkcionalitou. Jak je zvykem i z jiných prostředí, jsou ovládací prvky strukturovány do stromů. Kořenem stromu je hlavní okno. Potomky jsou prvky v tomto okně, které můžou rekurzivně obsahovat další potomky. Vzhled
V programu
hlavní okno
panel1
Hlavní okno -rodič není -potomci: panel1, panel2 panel2 Panel1 -rodič - hlavní okno -potomci tlačítko1, tlačítko2
Panel2 - rodič - Hlavní okno - potomci nejsou
tlačítko1 tlačítko2
Tlačítko1 - rodič panel1 -potomci nejsou
Tlačítko2 - rodič panel1 -potomci nejsou
obrázek 3.1 Identické rozmístění a vzhled prvků je garantováno na všech podporovaných operačních systémech. Rozmístění může být zadáno přesnou polohou prvku relativně ke svému rodiči a nebo pomocí tzv. layoutů. Layout neboli „rozvržení“ určuje rozmístění prvků na ploše prvku, ke kterému je přiřazen. Jedním typem je pomyslná mřížka pokrývající celou plochu prvku, ke kterému je přiřazen. Do buněk v mřížce se vkládají ovládací prvky. Jak se prvky rozmístí záleží na několika parametrech. Prvek může mít určenou minimální a maximální velikost a způsob chování, tzn. jestli se „snaží“ pokrýt co největší či nejmenší možnou plochu nebo zda mají velikost pevně danou. Nutno poznamenat, že výše uvedené vysvětlení je mírně zjednodušené. Jednotlivé parametry a způsoby chování je možno určovat odděleně v horizontálním a vertikálním směru. Existuje ještě zásobníkový typ layoutu. Ze všech prvků do něj vložených je vždy viditelný pouze jeden. Jeho použití je například u záložek, kde se viditelný prvek určuje podle označené záložky. Do layoutů leze vkládat nejen ovládací prvky, ale i další layouty. Možné je také navržení uživatelského rozhraní v programu Qt Designer. Uživatelské rozhraní v Qt nepoužívá standardní funkce pro vykreslování oken a tlačítek daného operačního systému. Všechny ovládací prvky jsou navrženy jako třídy a jejich vykreslování provádějí další speciální třídy. To s sebou přináší řadu výhod. Identický vzhled je tímto garantován a daný operační systém nemůže vzhled ovlivnit. Je možno dodat vlastní typ vykreslovací třídy pro nový vzhled ovládacích prvků a oken. Dále je možno z tříd ovládacích prvků odvozovat vlastní typy s přidanou funkčností, což přináší možnosti objektově orientovaného přístupu i tam, kde by to prostředky operačního systému nemusely podporovat.
Strana 6.
3.1.2 Modul OpenGL Umožňuje vkládat do uživatelského rozhraní prvky využívající akcelerovanou práci s grafikou prostřednictvím OpenGL. Tento prvek zajišťuje veškerou režii spojenou s inicializací včetně vytvoření OpenGL kontextu. Jelikož právě OpenGL bude použito pro zpracování a výstup obrazu, je podpora výhodou. Rozhraní OpenGL je realizováno funkcemi. V Qt jsou k dispozici třídy, umožňující přístup k OpenGL pomocí objektů. Jsou to tyto: • QGLContext – Zapouzdřuje renderovací kontext OpenGL. • QGLWidget – Je prvek uživatelského rozhraní používající k vykreslování OpenGL akceleraci. Jedná se o jednoduchou obdélníkovou oblast. Může mít svůj vlastní renderovací kontext nebo jej může sdílet s dalšími prvky uživatelského rozhraní. • QGLColormap – Barevná paleta pro QGLWidget. OpenGL může pracovat například s formátem barev RGBA na 32 bitech a výstup v uživatelském rozhraní můžeme pomocí této třídy redukovat například na 16 barev či odstíny šedi. • QGLFormat – zapouzdřuje konfiguraci renderovacího kontextu.
3.1.3 Systém slotů a signálů Tento systém rozšiřuje komunikaci mezi objekty C++. Jeden objekt vyvolá signál a druhý jej přijme pomocí slotu. Scénář použití je následující. Máme-li objekt A, který chce posílat zprávy objektu B, musí mít třída objektu A v deklaraci ve speciální sekci „signals:” definovánu metodu s určením parametrů – signál. Tato nemá tělo. Třída objektu B musí mí v sekci „slots:” definovánu metodu se stejnými parametry – slot. Deklarace obou tříd musí obsahovat makro Q_OBJECT – viz příklad. Po vytvoření objektů A a B je nutno spojit signál objektu A se slotem objektu B pomocí funkce „connect”. K poslání zprávy musí objekt A vyvolat signál se zadáním parametrů. Ten je přijat slotem objektu B a obsloužen. Signál je emitován jednoduše: za klíčovým slovem „emit” volání metody signálu s parametry. Je třeba dodat, že sekce „slots” i „signals” musí být „public”, „private” nebo „protected” podle způsobu zapouzdření, který jim chceme přiřadit. Příklad použití: Třída tlačítka uživatelského rozhraní obsahuje signál „stisknuto“, který je emitován při stisku tlačítka. Třídě nějakého objektu použitého v naší aplikaci přidáme slot např. „stisk_ok“ a slot se signálem instancí těchto tříd propojíme. Při stisku daného tlačítka je emitován signál „stisknuto“, který je obsloužen v metodě „stisk_ok“, která je slotem. Zdrojový kód příkladu: class MojeTlacitko { Q_OBJECT private: void libovolna_fce(); public signals: void stisknuto(); };
class MojeTrida { Q_OBJECT public slots: void stisk_ok(); };
void MojeTlacitko::libovolna_fce() { emit stisknuto() }
void MojeTrida::stisk_ok() { //obsložení události }
int main() { tlacitko MojeTlacitko; objekt MojeTrida; connect(&tlaitko, SIGNAL(stisknuto()), &objekt, SLOT(stisk_ok())); // nyní se při při volání funkce „libovolna_fce()“ emituje signal // „stisknuto“ a je obsloužen slot „stisk ok“ }
Strana 7.
Systém slotů a signálu je implementován pomocí maker a předzpracování kódu programem qmake, o kterém bude zmínka později.
3.1.4 Podpora projektů Psát Makefile ručně není příliš pohodlné zvláště u větších projektů. Qt disponuje programem, který generuje Makefile podle projektového souboru s příponou „pro“. Generování Makefile na základě projektového souboru má na starost program qmake, který je vlastně interpretem programu projektového souboru. Program očekává naplnění určitých proměnných jako například „SOURCES“ obsahující seznam zdrojových souborů. Je možno použít i podmínky například při přizpůsobování projektu operačnímu systému, na kterém je kompilován. Hlavní očekávané proměnné jsou tyto: • HEADERS – seznam hlavičkových souborů • SOURCES – seznam zdrojových souborů • LIBS – použité knihovny • QT – použité moduly Qt • CONFIG konfigurace Qt • TARGET – název výsledného spustitelného programu či knihovny • DESTDIR – cílový adresář • TEMPLATE – určuje typ výsledku (např. spustitelná aplikace, statická knihovna atd.) Příklad projektového souboru - soubor „hello.pro“: CONFIG += qt debug HEADERS += hello.h SOURCES += hello.cpp SOURCES += main.cpp win32 { SOURCES += hellowin.cpp } unix { SOURCES += hellounix.cpp } !exists( main.cpp ) { error( "Not found") }
#přidání konfigurace pro #generování ladící verze programu #přidání hlavičkových souborů a #souborů a zdrojů #výběr přidávaného zdroje podle #operačního systému
#zahlášení chyby, jesltiže není #nalezen soubor main.cpp
Makefile je vygenerován příkazem „qmake -o Makefile hello.pro“. Kromě toho jsou generovány i soubory s příponou „moc“, které zajišťují fungování systému signálů a slotů. Také dále popsaný systém zásuvných modulů a dynamicky linkovaných knihoven funguje pouze s podporou programu qmake. Vygenerovaný Makefile se liší podle operačního systému na kterém je generován. Pomocí parametrů programu qmake je možné vygenerovat různé výstupy pro podporované operační systémy a ty porovnat. Qmake je tedy součástí prostředků, které zajišťují přenositelnost Qt. Je možné použít jej i bez použití ostatních součástí Qt.
Strana 8.
3.1.5 Systém zásuvných modulů a dynamických knihoven Umožňuje jednoduchou tvorbu programů s podporou modulů a dynamicky linkované knihovny. Pomoci tohoto je možné rozšiřovat či upravovat aplikace bez nutnosti kompilace celého programu. Moduly a knihovny jsou implementovány jako dynamicky linkované knihovny daného operačního systému. Qt nabízí vývojáři vysokoúrovňové a nízkoúrovňové rozhraní. Vysokoúrovňové rozhraní nabízí rozhraní pouze pro rozšíření možností toolkitu Qt. Lze je rozšířit o: • Podporované formáty obrázků • Vlastní vzhled oken a ovládacích prvků • Podporované znakové sady • Ovladače klávesnic, myší a grafiky u vestavěných systémů • Ovladač SQL pro přístup ke specifickým databázím Pomocí nízkoúrovňových prostředků je možné vytvářet přenositelné moduly programu a knihovny. Rozšiřování programu. Rozšířit program je možné o zásuvný modul nebo o funkce dynamicky linkované knihovny. V jiných aplikacích to může být jedno a totéž, ovšem v Qt se jedná o dva odlišné přístupy. Zásuvný modul obsahuje definici jediné třídy s možností vytvořit jediný objekt, který je primárně určen k rozšíření jediné aplikace. Soubor tohoto modulu bude nejspíš umístěn v adresáři oné aplikace. Knihovna poskytuje spíše obecnou funkcionalitu, kterou můžou využívat libovolné aplikace. Její umístění bude tedy v místě určeném operačním systémem pro dynamicky linkované knihovny. Z programu máme přístup k libovolnému exportovanému symbolu knihovny, viz dále. Tvorba zásuvného modulu. Aplikace i zásuvný modul musí znát rozhraní třídy jejíž objekt bude rozšiřovat funkcionalitu aplikace. Jedná se vlastně o abstraktní třídu odvozenou od QObject, která musí být opatřena makrem „Q_OBJECT“. Na konci souboru misí být dalším makrem „Q_DECLARE_INTERFACE“ zadáno, že se jedná o rozhraní. Příklad: soubor „rozhrani.h“: class Rozhrani: public QObject { Q_OBJECT public: virtual void delej_neco() = 0; }; Q_DECLARE_INTERFACE(Rozhrani, "popis rozhrani...");
Moduly jsou samostatné projekty s vlastním projektovým souborem. Obsahují definici třídy, která je potomkem třídy rozhraní. Opět je opatřen makrem „Q_OBJECT“ a také makrem „Q_INTERFACES“ s názvem rozhraní, ze kterého je odvozen. Příklad: soubor „novy_modul.h“: #include class NovyModul: public Rozhrani { Q_OBJECT Q_INTERFACES(Rozhrani) public: void delej_neco(); };
Strana 9.
Dále ve zdrojovém souboru který musí obsahovat těla původně abstraktních metod rozhraní je na konci uvedeno makro „Q_EXPORT_PLUGIN“ informující o exportovaní třídy jako modulu. Příklad: Soubor „novy_modul.cpp“: void NovyModul::delej_neco() { // kód metody s novou funkčností } EXPORT_PLGIN(NovyModul)
Projektový soubor modulu musí mít nasteveno „TEMPLATE“ na „lib“ a proměnná „CONFIG“ musí obsahovat položku „plugin“ Příklad: soubor „novy_modul.pro“: TEMPLATE CONFIG HEADERS SOURCES
= lib += plugin = rozhrani.h \ novy_nodul.h = novy_modul.cpp
Z projektového souboru se vygeneruje Makefile. Přeložením Makefile vznikne dynamicky linkovaná knihovna daného operačního systému, která je modulem. V programu pak můžeme získat ukazatel na jedinou instanci třídy definované v modulu a to pomocí třídy QPluginLoader, které zadáme cestu k souboru s modulem. Příklad: QpluginLoader loader(cesta k soubru); instance = loader.instance();
Tvorba dynamicky linkované knihovny. Dynamicky linkovaná knihovna může být používána více programy i když je v paměti pouze jednou. Programy mají přístup ke všem exportovaným symbolům knihovny. Pro exportování symbolu, tak aby byla zajištěna přenositelnost, můžeme použít makro: #ifdef Q_WS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif
Příklad vytvoření exportované funkce se zmíněným makrem: extern "C" MY_EXPORT int sum(int a, int b) { return (a + b); } Projektový soubor knihovny musí obsahovat stejné položky jako u zásuvného modulu. K exportovanému symbolu knihovny se v programu dostaneme prostřednictvím objektu QLibrary, která obsahuje statickou metodu „resolve“. Té je zadáno jméno knihovny a exportovaného symbolu a návratová hodnota obsahuje ukazatel na tento symbol. Např.: typedef int (*typ_fce)(int, int); typ_fce suma = (typ_fce) Qlibrary::resolve("jmeno knihovny", "sum"); int s = suma(1, 2);
Strana 10.
3.2 Knihovna OpenGL Jak bylo specifikováno, program by měl využívat výkonu, který poskytují dnešní grafické karty akcelerovanou grafikou. Pro přístup k pokročilým funkcím grafické karty jako je například podpora trojrozměrného vykreslování je nezbytné využití určitého rozhraní, ktré to umožňuje. V dnešní době se v oblasti osobních počítačů uplatňují prakticky pouze dvě rozhraní. OpenGL a DirectDraw/Direct3D, které je součástí rozhraní DirectX. Rozhraní DirectX je použitelné pouze v operačních systémech Windows od společnosti Microsoft, čímž se stává pro tento projekt nevhodné, protože odporuje specifikované přenositelnosti programu. Proto bude použito OpenGL. OpenGL na rozdíl od DirectX poskytuje pouze nízkoúrovňové rozhraní ke grafické kartě. To ovšem není na závadu, protože tento projekt by stejně těžko hledal uplatnění pro vysokoúrovňové funkce DirectX, které usnadňují hlavně vykreslování složitých trojrozměrných scén. Výhodou OpenGL je jednoduché a přehledné rozhraní. Dále je výhodou zmíněná podpora v toolkitu Qt. Aplikace, která chce využívat OpenGL musí nejprve vytvořit tzv. „kontext“, což je jakési napojení okenního systému na knihovnu. Každý kontext má vlastní konfiguraci. K vytvoření kontextu bude využito právě Qt, které umožňuje také sdílení jediného kontextu mnoha prvky uživatelského rozhraní. To umožní vypočítat scénu jedinkrát a následně ji pouze zobrazit jak v okně náhledu, tak v okně výstupu. Je třeba objasnit určité pojmy použité v následujícím textu: • Framebuffer – Jakési plátno v grafické kartě na které je vykreslován obraz. Obrazová data z framebufferu je možno také přesouvat z a do operační paměti počítače. Je třeba určit v jakém formátu budou uloženy pixely ve framebufferu. Pro tento program, kde vstupy mohou používat různé palety či barevné hloubky je nejlepší použít formát, který pro každou složku (červená, zelená, modrá) používá jeden byte nazývaný, tedy „true color“. • Textura – Rastr uložený prostřednictvím v OpenGL použitelný jako povrch vykreslovaných elementů. Pro zachování přijatelného výkonu musí být umístěn v paměti grafické karty. Rozměry v pixelech musí být mocninou dvou. Existují jedno-, dvou- a třírozměrné textury. V tomto projektu naleznou uplatnění pouze 2D textury. Při složitějších úpravách obrazu se může stát, že potřebujeme vypočíst několik obrazů, ze kterých se bude tvořit další. Je třeba zvážit kde budou tyto obrazy „odkládány“, protože framebuffer je pouze jeden. Jednou možností je zkopírovat obraz z framebufferu do textury, která může být použita následně. Dalším možností pro uložení obrazu je použití tzv. „pixel-bufferů“. Jejich nevýhodu je, že jsou podporovány pouze u novějších grafických karet. Výhodou je, že rozměry mohou být libovolné od 1 do určité maximální hodnoty, např. 1024. V tomto programu budou k tomuto účelu použity textury. Vstup obrazových dat do OpenGL. Pro nahrání obrazu do OpenGL je možno: • Vytvořit novou texturu z obrazových dat v paměti. Vytvoření nové textury je výkonově příliš náročné. Tento způsob lze použít pouze u obrazu, který se nemění v čase tj. u statických obrázků. • Kopírovat obrazová data do existující textury. • Kopírovat data z operační paměti přímo do framebufferu. Poslední dvě varianty umožňují kopírovat pouze vybrané obdélníkové oblasti obrazu. Jsou vhodné i pro případy, kdy je nutné přenášet data často, například 25 snímků za sekundu u kamery či videa. Zpracování obrazu v OpenGL. Základní funkcí grafických akcelerátorů je vykreslování trojúhelníků, čar a bodů do framebufferu. Body kterými jsou tyto primitiva definovány se nazývají vertexy. Protože OpenGL umožňuje vykreslování 3D grafiky, jsou vertexy definovány pomocí své polohy v trojrozměrném prostoru, tedy třemi čísly. Z tohoto trojrozměrného prostoru probíhá projekce vertexů do plochy framebufferu, kde je následně jednoduchý objekt vykreslen. Promítání může být perspektivní nebo pravoúhlé. Viz obrázek č 3.2.
Strana 11.
perspektivní promítání vykreslovaný objekt
pravoúhlé promítání
plocha framebufferu
vykreslovaný objekt
Obrázek 3.2 Jak vidno, je pravoúhlé promítání vhodné tam, kde pracujeme pouze ve dvou rozměrech a chceme například kombinovat obrazy „skládáním vrstev“, jak to známe z programů pro práci s rastrovým obrazem (Gimp, Adobe Photoshop, atd.). Viz. Obrázek 3.3. Perspektivní promítání by bylo použitelné u složitějších efektů s 3D grafikou. skládání vrstev obrazu
plocha framebufferu
použité vrstvy
Obrázek 3.3
Strana 12.
Další použitelnou technikou OpenGL je tzv. „blending“. Jedná se o jednoduchý způsob kombinování podkladu, který se již nachází ve framebufferu a právě vykreslovaného objektu. Aplikuje se postupně na všechny barevné složky(červená, zelená, modrá, průhlednost) všech vykreslovaných pixelů. Dále v textu se „hodnotou pixelu“ myslí hodnoty všech jeho složek. Hodnota výsledného pixelu je rovna součtu hodnoty podkladu a vykreslovaného pixelu, které se násobí konstantami. Konstanty jsou uvedeny v následující tabulce 3.4 včetně použitelnosti na podkladový pixel(cíl) nebo vykreslovaný pixel(zdroj). Popis
Nula = černá barva Jedna = beze změny Barva cíle Barva zdroje Jedna mínus barva cíle Jedna mínus barva zdroje Hodnota průhlednosti zdroje 1 - Hodnota průhlednosti zdroje Hodnota průhlednosti cíle 1 - Hodnota průhlednosti cíle Menší z průhledností zdroje a cíle
Použitelnost Zdroj i cíl Zdroj i cíl Zdroj Cíl Zdroj Cíl Zdroj i cíl Zdroj i cíl Zdroj i cíl Zdroj i cíl Zdroj
Tabulka 3.4 Kombinacemi těchto použití těchto konstant lze dosáhnout efektů jako průhlednost, maskování, sčítání a odečítání jasů obrazu a další. Rotace, posun, zvětšování a zmenšování obrazu je možné provádět jednoduše vykreslením obrazu s použitím potřebné transformace, které OpenGL podporuje. Složitější deformace obrazu lze realizovat rozdělením obrazu na mnoho obdélníků, tedy do mřížky, na kterou se provedou potřebné deformace. Viz obrázek 3.5. Mřížka č. 1 je původní, na dalších jsou provedeny zmíněné deformace.
Obrázek 3.5 Dále je použitelný tzv. Opengl Imaging Subset. Je to sada pokročilých funkcí OpenGL pro práci s rastrovým obrazem. Ty jsou realizovány na pixelech ve framebufferu, nebo při přenosu pixelů z nebo
Strana 13.
do framebufferu. Nutno dodat, že ne všechny implementace OpenGL tuto sadu funkcí podporují. Před použitím je třeba zjistit, zda karta podporuje dané rozšíření. OpenGL rozšířené o tyto funkce umožňuje provádět složitější úpravy rastrového obrazu přímo na grafické kartě bez nutnosti přenášet data do operační paměti počítače, následně je upravovat v procesoru počítače a přenášet zpět do grafické karty. To znamená, že umožňují jednodušeji a rychleji provádět zmíněné úpravy. Při přenosu true-color pixelů se mohou na každé složce provést úpravy v pořadí, jak jsou uvedeny: • Přičtení konstanty. • Vynásobení konstantou. • Ořezání hodnoty do intrvalu <0,1>. • Transformace hodnoty pomocí tzv. lookup tabulky. Hodnota složky se vynásobí délkou příslušné tabulky a v tabulce je nalezena hodnota s takto vypočteným indexem. Nalezená hodnota je opět ořezána do rozsahu <0,1> a stává se novou hodnotou dané složky. Viz obrázek 3.4. • Aplikace konvolučního filtru. • Vynásobení konstantou. • Přičtení konstanty. Dále je během přenosu možno zjistit histogram, minimální a maximální hodnotu všech barevných složek.
Strana 14.
3.4 Knihovna FFMPEG Je open-source knihovna slouží pro práci se zvukem a videem na počítači. Umožňuje kódovat, dekódovat a vysílat na internetu. Pro tento projekt je důležité pouze dekódování videa. Použita bude verze 0.4.9-pre1. Je šířena pod licencí LGPL verze 2.1, což ji činí použitelnou v tomto projektu. Výhodou je požadovaná přenositelnost a množství podporovaných formátů pro kódování a dekódování (např. MPEG v. 1, 2 a 4; WMV v. 1, 2; MJPEG) Nevýhodou je absence jakékoli dokumentace minimum příkladů na internetu. Skládá se ze dvou hlavních částí: • avformat – čte nebo generuje obsah podporovaných formátů. • avcodec – kodéry a dekodéry podporovaných formátů.
3.5 Knihovana OpenCV Slouží hlavně k pokročilým analýzám obrazu pro počítačové vidění, jako je např. detekce pohybu atd. (název je odvozen od Computer Vision). Použita bude pouze část pro přístup k obrazu z kamer připojených k počítači – „cvcam“. Použití části „cvcam“ je jednoduché. Nabízí funkce pro zjištění názvů připojených kamer, podle kterých si může uživatel vybrat žádané zařízení. Vybrané kamery jsou nastaveny jako aktivní a je nastavena callback-funkce pro příjem obrázků. Po aktivaci začne příjem obrazů callback-funkcí. Příchozí obrazy jsou opatřeny identifikačním číslem, rozměry, barevnou hloubkou a počtem barevných kanálů. Nyní je možní použít je v programu. OpenCV taktéž o open-source přenositelnou knihovnu, jejíž šíření se řídí vlastními licenčními podmínkami. Hlavní podmínkou použití ať v binární nebo zdrojové podobě je přiložení těchto licenčních podmínek k dokumentaci či zdrojovým kódům.
3.6 Knihovna FMOD Slouží k nahrávání a záznamu zvuku a hudby. Ve verzi xxx, která bude použita obsahuje i některé další funkce jako zjišťování aktuální amplitudy a spektra přehrávaného zvuku. V tomto programu bude sloužit pro vstup externího audiosignálu ze zvukové karty pro generování a modulaci obrazu. Pro šíření používá podobný licenční model jako knihovna Qt. Pro použití v nekomerčních programech jako je tento je zdarma. Komerční použití je zpoplatněno. Je dostupná ve verzích pro Windows i Linux.
Strana 15.
4 Návrh programu 4.1 Uživatelské rozhraní Jak bylo zmíněno dříve, je cílem vytvořit takové uživatelské rozhraní, které nebude omezovat tvůrce svým jednostranným zaměřením a umožní kreativně kombinovat obrazové efekty. Častou koncepcí používanou v podobných programech je tzv. „video-sampler“. Ten pracuje nejčastěji s krátkými videosekvencemi, které se umístí do výstupu po stisknutí klávesy. Na každou video-sekvenci je možno aplikovat jeden filtr a zvolit způsob překrytí podkladu. Tím možnosti končí. Nutno dodat, že to často stačí, ale má-li autor představu o zajímavém výsledku, který by se dal vytvořit kombinací mnoha vstupů s použitím několika filtrů, má zkrátka smůlu. Systém virtuálních zařízení. V tomto programu bude použit jiný způsob práce s videosignálem a to pomocí tzv. virtuálních zařízení pro práci s videosignálem. Tento způsob je inspirován programy pro tvorbu hudby jako je například „Reason“ - viz obrázek 4.1. V tom nacházíme kopie skutečných elektronických zařízení, která je možno propojovat a to vše pouze virtuálně v paměti počítači. Výstup na zvukové kartě odpovídá výstupu virtuálního obvodu.
Obrázek 4.1 Zde bude využit analogický přístup ovšem s použitím přístrojů na zpracování videa propojených kabely, které budou přenášet videosignál. Nebudou použity virtuální kopie skutečných zařízení, ale zařízení smyšlené. Virtuální zařízení obsahují: • Vstupy, kterými do zařízení přichází signál, který může být v zařízení zpracován. Budou vždy na horní straně zařízení. • Výstupy zpracovaného signálu. Budou vždy na dolní straně zařízení. • Uživatelské rozhraní, které obsahuje ovládací prvky zařízení. Mělo by obsahovat popisek s názvem zařízení. Vstupy
Popisek
Rozhraní virtuálního zařírení obsahující nejrůznější tlačítka, popisky atd. Pomocí tohoto se zařízení ovládá
Výstup
Obrázek 4.2
Strana 16.
Zařízení se budou umisťovat na k tomu určenou plochu v programu, kde se propojí kabely a výsledkem bude obvod zpracovávající video. Zařízení mohou být: • Vstupní, tj. ty, kterými videosignál vstupuje do obvodu. Vstupní zařízení budou reprezentovat reálnou kameru, video-soubor, či obrázek uložený v počítači. Do této skupiny patří i zařízení generující obraz například podle externího audio-signálu. • Výstupní. Z těch videosignál z obvodu vystupuje. Reprezentují výstupní okno programu, které bude promítáno na projektor nebo náhled v programu. • Zpracovávající signál. Tyto přijímají videosignály na vstupech, nějak je transformují či slučují a výsledek je k dispozici na výstupu. Uveden příklad obvodu který umožní vytvořit prolínání mezi obrazem z kamery a přehrávaným video-souborem z počítače. Viz obrázek 4.3
Obrázek 4.3 „Kamera“ v obvodu reprezentuje reálnou kameru připojenou k počítači a pomyslný signál vycházející z tohoto virtuálního zařízení odpovídá reálnému signálu z kamery. „Soubor“ produkuje signál přehráváním video-souboru uloženého v počítači. „Prolínač“ zpracovává signály ze vstupů. K těm jsou připojeny připojené zařízení „kamera“ a „soubor“ pomocí virtuálních kabelů. Výstupem je signál obsahující vstupní signály v určitém poměru, který je zadán, pomocí ovládacího prvku na tomto zařízení. Viz obrázek 4.4 „Výstup“ reprezentuje výstup programu, tedy nejspíš určité okno s výstupním obrazem.
prolínání
Obrázek 4.4 – příklad vstupních obrazů a výsledku prolínání
Strana 17.
Tímto způsobem bude božné konstruovat libovolně komplikované obvody. Kreativita tvůrce tak nebude limitována. Propojování zařízení bude realizováno jednoduchým kliknutím na výstup zařízení a přetažením na zvolený vstup s okamžitým náhledem kabelu. Již umístěné kabely bude možné přepojovat. Prvotní verze bude obsahovat několik základních zařízení, které budou demonstrovat možnosti programu. Rozložení prvků uživatelského rozhraní. Uživatelské rozhraní bude obsahovat dvě okna. Hlavní okno programu a výstupní okno. Hlavní okno programu slouží hlavně k editaci virtuálního obvodu. Mělo by obsahovat také náhledový panel zobrazující zmenšenou verzi výstupu. Vždy totiž nemusí být vhodné ani pohodlné, aby tvůrce vizualizace sledoval výsledek přímo na projekční ploše. Dále by zde měl být panel umožňující výběr virtuálního zařízení spolu s náhledem a popisem vlastností tohoto zařízení, které bude možno umístit do obvodu jednoduchým přetažením. Rozvržení prvků hlavního okna: nadpis okna hlavní menu
hlavní plocha pro virtuální obvod
seznam dostupných zařízení
náhled vybraného zařízení
popisek vybraného zařízení
náhled výstupu obvodu
Obrázek 4.5 Obsahem okna výstupu by měl být pouze výstupní obraz s možností roztažení na celou obrazovku, pro finální výstup na projektor.
Strana 18.
4.2 Návrh programu Z důvodu zachování jednoduchosti bude program běžet v jediném vlákně. To se může nepříjemně projevit. Programová tvorba vizualizace musí mít častý přístup k výkonu procesoru a to v intervalu vytváření jednotlivých snímků obrazu. Jestliže na straně uživatelského rozhraní dojde k operaci, která „zaměstná“ procesor na delší dobu, nebude možné obraz periodicky obnovovat, což se může projevit „záseky“ ve výsledné vizualizaci. Na vyřešení tohoto problému by se mohla zaměřit další verze programu. Kritická bude hlavně operace překreslování virtuálního obvodu. Pokud bude mít tvůrce předem připravené virtuální obvody tzn. Nebude třeba překreslovat celou obrazovku během tvorby obvodu, nemusí se tato nedokonalost vůbec projevit. Program bude zhotoven objektově orientovaným přístupem, čemuž musí odpovídat i návrh. Budou popsány základní třídy a jejich rozhraní. Mohou být použity i prvky a terminologie z oblasti návrhových vzorů. Hlavní objekty v programu. Mnoho tříd je navrženo tak, že mají v programu pouze jednu instanci. Na nejvyšší úrovni budou dva objekty přístupné globálně z celého programu. Objekt reprezentující systém pro zpracování obrazu(dále jen Systém) a objekt reprezentující uživatelské rozhraní(dále jen Gui). Tyto dva jsou spolu ve vztahu model/view (viz. Obrázek č.4.6). Model zajišťuje funkcionalitu, view umožňuje stav modelu zobrazit a měnit. Systém je instancí třídy VisSystem, gui je instancí třídy VisGui. Model
View
Systém
Gui
Obrázek 4.6 Tento přístup pomáhá zamezit vytvoření nepřehledné spleti vztahů v programu. Další výhoda se týká možnosti dalších úprav architektury v budoucnu. Objekty by bylo možno oddělit „mostem“ tak, aby každý mohl běžet ve vlastním vlákně. Oba objekty v obsahují další pod-objekty. Gui obsahuje jednotlivá okna programu, která zase obsahují ovládací prvky. Systém obsahuje objekty tématicky postihující určitou oblast. Jsou to: • Oblast zpracování a vykreslování videa v OpenGL • Správce modulů programu • Správa virtuálního obvodu • Přístup k multimédiím – obrázkům, videím, obrazu z kamery a externímu audiosignálu. Oblast zpracování a vykreslování obrazu v OpenGL – třída VisRenderer. Úkolem této třídy je především inicializace a konfigurace OpenGL a zapouzdření některých rutinních operací souvisejících s vykreslováním v OpenGL(nastavení viewportu, projekce, vytváření textur atd.). Dále řídí časování a vykreslování výsledného obrazu do výstupních oken. Správce modulů programu – třída VisDevFactories. Modularita programu je zajištěna možností přidávat další virtuální zařízení použitelná v obvodech. Každý modul je „továrnou“ na tvorbu virtuálních zařízení, která je schopna tvořit instance tříd jednotlivých typů zařízení. Rozhraní modulu by mělo poskytovat: • Informaci o jméně modulu • Seznam jmen zařízení, která obsahuje • Možnost vytvořit zařízení podle jména. Moduly budou realizovány jako zásuvné moduly Qt. Třídy modulů budou vycházet z jediného předka – abstraktní třídy VisAbstractDevFactory, která definuje rozhraní. Způsob implementace potřebných metod už záleží pouze na volbě tvůrce modulu. Základní moduly budou děleny podle typu zařízení například na: vstupní, filtry atd.
Strana 19.
Moduly a jejich zařízení budou realizována v oddělených projektech Qt a proto je třeba zajistit jim rozhraní přístup k funkcím Systému. Rozhraní bude definováno abstraktní třídou s potřebnými metodami, na kterou bude mít odkaz každý objekt virtuálního zařízení. Při tvorbě objektu dostane každé zařízení odkaz na objekt realizující dané rozhraní. Dynamické propojení za běhu programu Modul vstupních zařízení
Správce modulů
Modul filtrů obrazu
Obrázek 4.7 Správa virtuálního obvodu – třída VisCurcuit. Instance této třídy udržuje informace o virtuálním obvodu, tedy o zařízeních a jejich propojeních. Virtuální zařízení jsou realizována objekty, které zajišťují jak funkčnost – tedy operace s obrazem, tak uživatelské rozhraní, kterým se zařízení ovládá. Nutno dodat, že toto odporuje rozdělení architektury programu podle vzoru model/view. Z důvodu zachování přiměřené jednoduchosti programu bude toto tolerováno. Virtuální obvod vlastně tvoří strukturu strom. Kořenem je výstupní zařízení, listy jsou vstupní zařízení. Propojení není definováno přímo pomocí odkazů v uzlech ale pomocí prvků, které reprezentují propojení, tedy kabely ve virtuálním obvodě. Propojení jsou realizována strukturou VisConnection. Ta obsahuje indexy propojených zařízení a indexy použitého vstupu a výstupu. Viz obrázek. Zařízení
kamera
video
filtr
kombinátor obrazů
výstup
propojení
Obrázek 4.8 Autor vizualizace by měl mít představu, že signál jaksi postupuje shora dolů – od vstupních zařízení k výstupu. Při tvorbě obrazu v programu se ovšem postupuje od kořene stromu, tedy zdola
Strana 20.
nahoru. Vykreslení každého snímku zahrnuje průchod celým stromem. Aby se průchod urychlil, bude index propojení určen jako: index zařízení do kterého signál vstupuje + index vstupu. Aby to bylo možné, budou zařízení indexována čísly zvyšujícími se o 10 a maximální počet vstupů bude 9. Viz obrázek: video
kamera
index=10
index=20
propojení 1 index=30(30+0) ze zařízení s indexem 10, výstup 0 do zařízení s indexem 30, vstup 0
kombinátor index=30
propojení 1 index=31 (30+1) ze zařízení s indexem 20, výstup 0 do zařízení s indexem 30, vstup 1
Obrázek 4.9 Tímto přístupem se dosáhne vysoké rychlosti při průchodu stromem od kořene k listům. Opačný postup je pomalejší, protože je potřeba projít všechna propojení, ale to není na závadu, protože to nastane snad v jediném případě a to když bude rušeno určité zařízení a bude třeba zrušit i všechny propojení ve kterých účinkuje. Dále bude mít tento objekt v režii ukládání a načítání obvodu ze souboru. Specifické vlastnosti si budou jednotlivá zařízení ukládat a načítat sama. Přístup k multimédiím – třída VisMedia. Dává zařízením jednoduché rozhraní pro přístup k obrázkům videím, obrazu z kamer a externímu audiosignálu. Objekt této třídy v sobě obsahuje instance objektů pro práce s jednotlivými typy vstupů. V definici třídy jsou použita pouze abstraktní rozhraní. Konkrétní implementace jsou závislé na použité technologii pro danou oblast. Například přístup k video-souboru je definován v abstraktní třídě VisAbstractVideostream. Konkrétní implementaci je realizována pomocí knihovny FFMPEG. Tento způsob dává možnost zvolit v budoucnu jinou implementaci, či volit implementaci podle operačního systému, na kterém se projekt kompiluje. Použité Abstraktní třídy jsou: • VisAbstractVideostream • VisAbstractCamera • VisAbstractSoundIn Obrázky jsou načítány přímo pomocí knihovny Qt. Třídy poskytující obraz musí umožnit vytvoření náhledu obrazu a přesun obrazu do grafické karty pomocí rozhraní OpenGL.
Strana 21.
5 Výsledný program Program byl zatím implementován pouze na operační systém Windows, ale teoreticky nic nebrání tomu, aby byl přenesen i na Linux.
5.1 Struktura adresářů, spuštění, kompilace Struktura adresářů programu v podobě v jaké bude šířen: source filters_plugin generators_plugin input_plugin program release devhelp images plugins sample_project
- adresář zdrojových kódů - zdrojový kód modulu s video-filtry a kombinátory - z. k. modulu, který obsahuje zařízení generující obraz - z. k. modulu vstupních zařízení - zdrojový kód samotného programu - adresář spustitelného programu modulů a potřebných knihoven - nápověda k dostupným zařízením - obrázky potřebné při běhu programu - adresář se zásuvnými moduly - demonstrační projekty i s potřebnými daty
Pro spuštění programu je třeba pouze zkopírovat jej na harddisk a spustit soubor „whizzualizer.exe“ z adresáře „release“. Pokud by se vyskytly problémy s připojením kamery, spusťte soubor „_setup_camera.bat“ v adresáři „release“. Kompilace programu i modulů probíhají stejným způsobem a to spuštěním příkazů „qmake“, který vygeneruje Makefile na základě projektového souboru a „make –f Makefile.Release“ pro kompilaci. To vše v adresáři se zdrojovými kódy kompilované součásti. Pro úspěšné zkompilování musí být v systému nainstalován sada programů Mingw s kompilátorem gcc verze 3.4.2, u jiných verzí nejsou vyloučeny komplikace. Dále musí byt nainstalováno a nakonfigurováno Qt open-source verze 4.1. Hlavičkové statické knihovny použitých knihoven musí být přítomny v adresářích kde je hledá kompilátor. Hlavičkové soubory knihoven jsou hledány v podadresářích: OpenGL v „GL“, OpenCV v „CV“, FMOD verze 3.7.5 v „FMMOD“ a FFMPEG verze 0.4.9-pre v „FFMPEG“.
Strana 22.
5.2 Uživatelské rozhraní, ovládání Hlavní okno programu je na obrázku 5.1. Na hlavní plochu se umísťují virtuální zařízení, která se dále propojují kabely. Výsledný obraz - tvořený v reálném čase virtuálním obvodem - je možno sledovat v okně náhledu. Výstupní okna s finálním výstupem se přidávají pomocí hlavního menu. Hlavní menu také nabízí možnost ukládat a načítat virtuální obvody ze souboru.
Obrázek 5.1 Hlavní menu programu. Struktura hlavního menu a význam jednotlivých položek. • File ➢ New – Vytvoří nový virtuální obvod, který neobsahuje žádná zařízení ➢ Open – Načte virtuální obvod ze souboru ➢ Save – Uloží virt. obvod do souboru ➢ Save as - Uloží virt. obvod do souboru pod novým jménem • View ➢ Preview – Zobrazení/skrytí náhledu výstupu v hlavním okně ➢ Add output window - Přidání dalšího výstupního okna • Help ➢ About – Zobrazení krátké informace o verzi, autorovi atd.
Strana 23.
Panel zařízení. Nachází se ve spodní části hlavního okna. Obsahuje seznam dostupných virtuálních zařízení. Jméno zařízení je ve formátu „<jméno modulu> :: <jméno zařízení>“. Jméno modulu udává modul, ve kterém je zařízení implementováno. Po označení určitého zařízení se napravo od seznamu zobrazí náhled daného zařízení a krátký popis funkce. Virtuální zařízení. Popis zařízení – viz. Obrázek č 5.1.
vstupy
tlačítko pro zrušení zařízení
popisek se jménem zařízení
uživatelské rozhraní s ovládacími prvky
výstup
Obrázek 5.2 Editace virtuálního obvodu. Začíná umístěním virtuálních zařízení na hlavní plochu programu. To se provede jednoduchým přetažením náhledu z panelu zařízení na hlavní plochu. Zařízení lze na plochu umístit, pokud se během přetahování zobrazuje jeho obrys zeleně. Červená znamená, že se kryje s jiným zařízením. Posun všech zařízení se provede stiskem pravého tlačítka myši a tažením. Obvod musí obsahovat minimálně jedno vstupní zařízení a jedno výstupní zařízení, aby měl smysl. Propojovat lze samozřejmě jen výstupy s vstupy zařízení. Propojování začne stisknutím levého tlačítka myši na požadovaném vstupu nebo výstupu či v jeho blízkém okolí. Tím začne tažení kabelu, které se projevuje zobrazením kabelu od označeného vstupu nebo výstupu vedoucího ke kurzoru myši (viz obrázek 5.3). Tažení je ukončeno uvolněním tlačítka myši. Pokud je tlačítko uvolněno na vstupu nebo výstupu, je uskutečněno propojení. Jinak se nestane nic, tažení končí, náhled kabelu mizí. Pokud je levé tlačítko myši stisknuto na vstupu nebo výstupu, do kterému už nějaký kabel vede, tak se tento kabel uvolní do fáze tažení a je možno jej přetáhnout do jiného vstupu nebo výstupu.
Obrázek 5.3 Obvod může obsahovat více výstupních zařízení. Proto je nutné vybrat aktivní výstup tlačítkem „vybrat“ daného zařízení. Pokud není označen výstup, nebo v obvodu chybí vyžadované propojení, nezobrazí se žádný výstup.
Strana 24.
Výstupní okno programu. Slouží k finálnímu výstupu obrazu na projektor, Výstupních oken může být v programu více. Přidávají se pomocí hlavního menu (View – Add output window). Ruší se prostým zavřením. Může pracovat ve dvou módech a to jako normální okno (viz obrázek 5.4) nebo jako okno roztažené přes celou obrazovku. Mód je možno zvolit stiskem pravého tlačítka nad oknem a výběrem módu. Ve Windows se obraz na výstup, na který je připojený projektor přesměruje následovně: V nastavení zobrazení rozšíříme pracovní plochu o obraz dalšího výstupu. Poté výstupní okno přetáhneme na druhou plochu a roztáhneme jej přes celou obrazovku.
Obrázek 5.4
Strana 25.
5.3 Implementovaná virtuální zařízení Modul STANDART. Je zabudován v přímo v hlavním programu. •
OUTPUT – Jediné výstupní zařízení. Svůj vstup do okna náhledu a výstupních oken
Obrázek 5.5 Modul INPUT. Obsahuje vstupní zařízení.
•
•
•
VIDEO – Přehrává videosoubor na výstup. Stiskem tlačítka „load“ se zobrazí dialog pro výběr souboru k přehrávání. První ovládací tlačítko (>) slouží ke spuštění a pozastavení přehrávání. Tlačítko (O) zastaví přehrávání. Zařízení disponuje náhledem na první snímek souboru.
Obrázek 5.6 IMAGE – Načte obrázek a zobrazí jej na výstup. Načítání probíhá obdobně jako u předchozího. Taktéž je zobrazen náhled obrázku.
Obrázek 5.7 CAMERA – Na výstup posílá signál z vybrané kamery připojené k počítači. Tlačítkem „refresh“ se aktualizuje seznam dostupných kamer. „... any ...“ v seznamu znamená že není označena žádná z kamer. Náhled je pořizován v době označení kamery a není aktualizován.
Obrázek 5.8 Modul GENERATORS. Obsahuje zařízení generující obraz: • WAVE – Tvoří obraz vycházející z frekvenčního spektra externího audiosignálu
Obrázek 5.9 Modul FILTERS. Obsahuje zařízení upravující a slučující obraz:
Strana 26.
•
•
•
•
FADER – Tvoří prolínání mezi vstupními signály. Je možné měnit způsob prolínímí („type“) a fázi („phase“)
Obrázek 5.10 CUBE – Na výstup obrazí rotující kostku. Na pozadí je jeden vstupní signál, kostka má obraz druhého vstupu na svých stěnách. Měnit se dá velikost („size“) a rychlost („speed“) kostky.
Obrázek 5.11 LIGHTNESS – Umožní měnit jas obrazu („brightness“) a přidat efekt „vypálení“ („burn out“)
Obrázek 5.12 COLORIZER – Mění poměry složek červené („red“) zelené („green“) a modré („blue“) v obraze.
Obrázek 5.13
Strana 27.
5.4 Tvorba nových modulů Skládá se z tvorby tříd virtuálních zařízení a třídy modulu. Dále je potřeba vytvořit projektový soubor modulu. Moduly se totiž kompilují nezávisle na programu. Na konci podkapitoly je příklad, který je jakousi šablonou pro tvorbu nových virtuálních zařízení a modulů.
5.4.1 Třída nového virtuálního zařízení Třídy všech nových virtuální zařízení musí být potomky třídy VisAbsatractDevice. V té je definováno rozhraní a základní funkcionalita společná všem zařízením. Základem je nastavit počet a polohu vstupů a výstupů a předefinovat metody „init“, „free“ a „getOutput“. Každé zařízení může mít nanejvýš devět vstupů a devět výstupů. Informace o použití a poloze jsou definovány v polích celočíselných hodnot „inputs“ a „outputs“ délky devět. Nula znamená, že není použit, jiné číslo znamená použití a zároveň udává polohu v horizontálním směru. Na začátku jsou všechny hodnoty rovny nule. Příklad je na obrázku č 5.4. inuts[0] = 10; inputs[1] = 45; outputs[0] = 27
45 10
60
27
Obrázek 5.14 Nastavení vstupů a výstupů se děje ve funkci „init“ která je volána po vytvoření zařízení a je určena pro inicializaci. V této metodě se také vytváří grafické rozhraní zařízení, které je stejně jako program postavené na GUI modulu Qt. Na rozhraní zařízení se můžou umístit libovolné ovládací prvky Qt. V Metodě „init“ by měla být nastavená proměnná background, což je ukazatel na Qpixmap. Ta se automaticky používá jako pozadí rozhraní zařízení. Může být načtena ze souboru, nebo je zde možnost použít zděděnou metodu setLook() která pozadí vygeneruje. Podle jména, výškty, šířky a barvy (viz. dále). Dále musí být předefinována metoda „dName“ a chceme-li využít automatické generování pozadí, tak také metody „dWidth“, „dHeight“ a „dColor“. Ukládání a načítání ze souboru zajišťuje třída VisCurcuit. Ta ale ukládá pouze vlastosti společné všem zařízením. Specifické vlastnosti si musí každé zařízení uložis a načíst samo. Ukládané vlastnosti jsou ukládány v textové podobě a jsou definovány jménem. Každé zařízení s potřebou ukládat a načítat data musí předefinovat i metody „save“ (volá se při ukládání obvodu), kde si uloží své vlastnosti a „setProperty“(volá se při načítání obvodu), kde si zpracuje vlastnosti ze souboru (tedy ty, které si samo uložilo). Pro ukládání je definována metoda „saveProperty“ podporující ukládání hodnot typu „bool“, „int“, „double“ a řetězce „char *“ a „QString“. Parametry a návratové hodnoty zmíněných metod jsou k dispozici v příkladu, který bude následovat. Samotná práce s obrazem se děje po jednotlivých snímcích. Standardní scénář je takový, že zařízení si vyžádá snímky ze zařízení, která jsou napojena na jeho vstupy, nějak je zpracuje a poskytne
Strana 28.
výsledný snímek poskytne zařízení které je napojeno na jeho výstup. Jak bylo zmíněno, virtuální obvod je abstraktní datová typ strom. Jestliže zpracování snímku (průchod uzlem stromu) začíná žádostí o obraz ze zařízení napojených na vstupy (synovské uzly), pak se jedná o průchod stromem typu post-order. Zpracování snímku se děje v metodě getOutput, pomocí které se zařízení žádá o poskytnutí výstupu. Snímky(vstupy a výstup při zpracování snímku) jsou uloženy jako textury OpenGL. Pokud s nimi chceme pracovat, musíme nastavit viewport OpenGL, typ promítání, vykreslit do framebufferu výsledný obraz a ten nakopírovat do výstupní textury za použití běžného rozhraní OpenGL a funkcí rozhraní k Systému, které je popsáno v dalším odstavci. Modul a jeho zařízení jsou součástí samostatného projektu nezávislého na hlavním programu a tudíž není možný přístup k proměnným globálně dostupným v programu. Zařízení ovšem potřebují přístup k metodám Systému, který je součástí hlavního projektu. Proto každé zařízení získá po svém vytvoření přístup k rozhraní, které tyto funkce zprostředkovává. Jedná se o ukazatel „sys_ifc” ukazující na objekt s metodami: • „getPixmap” a „freePixmap” pro získání a uvolnění obrázků použitelných v uživatelském rozhraní zařízení. • „getTexture” a „freeTexture” pro získání a uvolnění textur z které je možno použít při tvorbě obarzu • „getVideoStream” vrací ukazatel na objekt umožňující získání obrazu z přehrávaného videosouboru. „freeVideoStream” tento objekt uvolní. • „getCamera” vrací ukazatel na objekt který umožní získat obraz z připojených kamer. • „getSpectrum512” vrací odkaz na pole typu float o délce 512 obsahující frekvenční spektrum externího audio-signálu. • „getDynamicTexture” a „freeDynamicTexture” pro získání a uvolnění dynamických textur, což jsou prázdné textury o velikosti, kterou systém používá pro zprcování obrazu. • „setView” nastavuje viewport OpenGL na potřebnou velikost. • „copyFrameToTexture” kopíruje obraz z farmebufferu do dynamické textury. • „getDevOutput” získá výstupní obraz zařízení, které je napojeno na vstup zařízení. Pomocí této funkce probíhá rekurzivní průchod virtuálním obvodem. • „deleteDevice” pro zrušení zadaného zařízení. • „getElapsed” vrací čas v milisekundách, který uběhl od spuštění aplikace. Dále uvedený příklad ukazuje zařízení kterým které do videosignálu přidá černý obdélník, doprostřed obrazu. Jeho přidáváni je možno zapínat/vypínat tlačítkem. Jeho třída je jmenuje VisNoveZarizeni. Soubor „novezarizeni.h“:
Strana 29.
#ifndef D_NOVEZARIZENI_H #define D_NOVEZARIZENI_H #include "abstractdevice.h" #include class VisNoveZarizeni: public VisAbstractDevice { Q_OBJECT public: // šířka a výška zařízení je definována takto, ale byla dostupná // z třídy modulu bez nutnost konstruovat objekt. enum proportion { devWidth = 100, devHeight = 75 }; // udání vlastností: jména, šířky, výšky, barvy virtual QString dName(){return QString("nove_zarizeni");}; virtual int dWidth(){return devWidth;}; virtual int dHeight(){return devHeight;}; virtual QColor dColor(){return QColor(100, 100, 170);}; // předefinované metody inicializace, uvolnění bool init(); void free(); // předefinované metody uložení stavu a nastavení vlastnosti void save(QTextStream & out); void setProperty(QString & name, QString & value); // metoda vracející výstupní obraz výstupu o zadaném indexu(0-9) GLuint getOutput(int index); private: // tlacitko pro zapinani/vypinani zobrazeni obdelniku QPushButton * tlacitko; // stav zobrazeni obdelniku (ano/ne) bool obdelnik; // dynamicka textura pro vystupni obraz Gluint textura; private slots: // slot pro obsluhu stisku tlačítka void stisknuto(); };
Strana 30.
zdrojový soubor zařízení – „nove_zarizeni.cpp“: #include "nove_zarizeni.h" bool VisNoveZarizeni::init() { // ziskání dynamické textury pro výstupní snímek textura = sys_ifc->getDynamicTexture(); obdelnik = true; // nastavení aktivity a pozice pro jeden vstup a jeden vystup inputs[0]=50; outputs[0]=50; //nastavení tlačítka talcitko = new QPushButton(„zap-vyp“); talcitko->setParent(this); talcitko->move(20, 20); talcitko->resize(50, 15); talcitko->show(); // propojení signálu tlačítka se slotem „stisknuto“ connect(tlacitko, SIGNAL(pressed()), this, SLOT(stisknuto())); }
return true;
// uvolnění použitých zdrojů void VisNoveZarizeni::free() { sys_ifc->freeDynamicTexture(textura); } // uložení stavu void VisNoveZarizeni::save(QTextStream & out) { saveProperty(out, "zobrazen", obdelnik); } // nastavení vlastnosti při načítání ze souboru void VisNoveZarizeni::setProperty(QString & name, QString & value) { if (name == "zobrazen") { bool ok; bool b = value.toInt(&ok); if (ok) obdelnik = (bool)b; } }
Strana 31.
//obsluha stisku tlačítka void VisNoveZarizeni::stisknuto() { obdelnik = !obdelnik; } GLuint VisNoveZarizeni::getOutput(int index) { //získání vstupního obrazu z nultého vstupu GLuint vstup = sys_ifc-> getDevOutput(id, 0); // test na chybu, například nepřipojení kabelu na vstup if (vstup != 0) { sys_ifc->setViewport(); sys_ifc->setOrtho(); // nastavení příznaků opengl glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); // vykresleni vstupního obrazu jako podklad glBindTexture(GL_TEXTURE_2D, vstup); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(0.0, 1.0); glVertex3f(0.0, 1.0, glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 0.0, glEnd();
0.0); 0.0); 0.0); 0.0);
glDisable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); //vykreslení černého obdélníku, pokud je povolen if (obdelnik) { glColor3f(0.0, 0.0, 0.0); glBegin(GL_TRIANGLE_STRIP); glVertex3f(0.2, 0.8, 0.0); glVertex3f(0.2, 0.2, 0.0); glVertex3f(0.8, 0.8, 0.0); glVertex3f(0.8, 0.2, 0.0); glEnd(); } // zkopírovaní obrazu z framebufferu do výstupní textury sys_ifc->copyFrameToTexture(textura); return textura; } else return 0; }
Strana 32.
5.4.2 Třída nového modulu Využíván je systém modulů Qt. Všechny třídy modulů musí být potomky třídy VisAbstractDeviceFactory, která definuje rozhraní. Třída modulu musí být opatřená makrem Q_OBJECT a Q_INTERFACES s názvem rozhraní modulu, tedy Q_INTERFACES(VisAbstractDeviceFactory). Ve zdrojovém souboru modulu (.cpp) musí být makro Q_EXPORT_PLUGIN2(<popisek s modulu>, <jméno třídy modulu>) Metody které musí být předefinovány: • „typeNames“ vrací jména všech typů zařízení, které modul obsahuje. • „factName“ vrací jméno modulu, které se zobrazí v programu. • „deviceSize“ vrací rozměry zařízení zadaného jménem. • „createDevice“ vytvoří zařízení zadané jménem. Nezáleží na tom, jakým způsobem budou tyto metody implementovány.
5.4.3 Projektový soubor modulu Struktura bude vysvětlena rovnou na příkladu který definuje projekt pro modul z předchozího příkladu. # takto je v projektovém souboru Qt značen komentář # nastavení proměnných projektu pro tvorbu modulu TEMPLATE = lib CONFIG += plugin # cesta pro hledání hlavičkových souborů # zde se kvůli rozhraním jedná o adresář se zdr. kódem programu INCLUDEPATH += ../program # použité hlavičkové soubory HEADERS =../program/abstractdevicefactory.h \ ../program/abstractdevice.h \ novy_modul.h \ nove_zarizeni.h # použité zdrojové soubory SOURCES =../program/abstractdevice.cpp \ novy_modul.cpp \ nove_zarizeni.cpp # určení jména souboru s modulem TARGET = filters # určení kam se má nahrát výsledný modul # zde se jedná o adresář se spustitelným souborem programu DESTDIR = ../../release # použité moduly Qt QT += opengl
Makefile je vygenerován spuštěním příkazu „qmake“ v adresáři se zdrojovým kódem modulu. Kompilace se spustí příkazem „make –f Makefile.Release“ tamtéž. Po spuštění programu by se zařízení z modulu měla objevit v seznamu zařízení.
Strana 33.
5.5 Výsledky testování Kamery. Program byl testován se dvěma kamerami. S oběma byl plně funkční. Jednalo se o fotoaparát FujiFilm FinePix 2600Z ve funkci webkamery a webkameru Logitech QuickCam
Messenger. Formáty videa. Testovány byly soubory komprimované metodou mpeg1, wmv1, wmv2. Dále „avi“ soubory s nejrůznějšími způsoby komprese (divx, xvid). Přehrávání fungovalo bez problémů. Konfigurace počítačů na kterých byl program testován: • Procesor AMD Athlon 1600+, 256 MB paměti, grafická karta GeForce 2 MX 64 MB • Notebook s proc. Intel CM370 1.5GHz, 512 MB paměti, graf. Karta ATI X700 64MB • Procesor Intel Pentium 4 3.3 Ghz, 512 MB paměti, graf. Karta ATI X700 256MB Kromě těchto to byly ještě některé další a všude byl plně funkční. Také testování výstupu na druhý monitor fungovalo bez problému. Výkon. Frekvence překreslování výstupního obrazu byla dostatečná pro udžení dojmu plynulosti i na neslabším z testovaných počítačů a to i v případě přehrávání několika videí, použitím vstupu z kamery a mnoha efektů.
Strana 34.
6 Závěr Výsledný program splňuje požadavky kladené ve specifikaci. Jedná se o program použitelný v praxi s možnostmi dalšího vývoje. Zvláště přidání dalších virtuálních zařízení by zvýšilo míru použitelnosti programu. Virtuální zařízení v současné verzi programu spíše demonstrují možnosti programu, které jsou nemalé. Další možnosti vývoje jsou v oblastech: Uživatelské rozhraní. Výhodná se jeví možnost jiného řešení propojování zařízení. Úsporu místa i vyšší přehlednost by přineslo uspořádání zařízení nad sebe s tím, že vstupy a výstupy by byly umístěny ze zadní strany, kde by probíhalo také propojování. Uživatel by si přepínal pohledy zepředu pro ovládání zařízení a zezadu pro propojování. Místo malých jednoúčelových zařízení by bylo vhodnější vytvořit zařízení komplexnější, kterých by v obvodu bylo méně, čímž by se zpřehlednil. Vlákna. Jak bylo zmíněno v úvodu, program v současné době běží v jednom vlákně, což má za důsledek možná přerušení vykreslování výstupu v případě výkonově náročného požadavku na straně uživatelského rozhraní. To by šlo vyřešit použitím samostatných vláken pro uživatelské rozhraní a systém vykreslování. Ovládání virtuálních zařízení. Přínosné by bylo přidání automatického nastavování ovládacích prvků zařízení například podle předem připravených hodnot na časové ose či podle externího audiosignálu. Přínos programu je hlavně v tom, že ukazuje možnosti zpracování videosignálu v reálném čase za použití grafických akcelerátorů. Program sleduje trend vytváření modulárních programů, které dávají možnost dalším vývojářům přidávat vlastní součásti.
Strana 35.
7 Literatura Při návrhu a tvorbě jsem vycházel z následujících zdrojů:
Hudec, B.: Základy počítačové grafiky Praha, Vydavatelství ČVUT 2001 Segal, M., Akeley, K.: The OpenGL Graphics System: A Specification (Version 1.5) http://www.opengl.org Molofee, j.: OpenGL Windows Tutorials http://nehe.gamedev.net
Strana 36.
8 Příloha 8.1 Licence OpenCV Z licenčních podnímek knihovny OpenCV vyplývá, že může být použita pouze pokud bude následující text uveden v dokumentaci, které ji používají.
IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By downloading, copying, installing or using the software you agree to this license. If you do not agree to this license, do not download, install, copy or use the software. Intel License Agreement For Open Source Computer Vision Library Copyright (C) 2000-2005, Intel Corporation, all rights reserved. Third party copyrights are property of their respective owners. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistribution's of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistribution's in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The name of Intel Corporation may not be used to endorse or promote products derived from this software without specific prior written permission. This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the Intel Corporation or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
8.2 Data na CD Přiloženo je CD s programem, dokumentací, návodem a knihovnami potřebnými ke kompilaci.
Strana 37.