Bakalářská práce

Transkript

Bakalářská práce
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 <rozhrani.h>
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 <QPushButton>
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.

Podobné dokumenty

3.0 MB - NeHe OpenGL Tutoriály

3.0 MB - NeHe OpenGL Tutoriály V lekci 24 jsem vám ukázal cestu, jak nahrávat nekomprimované 24/32 bitové TGA obrázky. Jsou velmi užitečné, když potřebujete alfa kanál, ale nesmíte se starat o jejich velikost, protože byste je i...

Více

funkce deckles

funkce deckles Ostatní parametry mají implicitní hodnotu 0, resp 0.0f.

Více

1 Úvod - Website of Marek Gayer, Ph.D.

1 Úvod - Website of Marek Gayer, Ph.D. Technika, pomocí které je umožněno rozhraní OpenGL rychleji a v dobré obrazové kvalitě provádět změnu velikosti zobrazovaných textur. Před použitím textur se pomocí určitých algoritmů pro změnu vel...

Více

ostravská univerzita aplikace grafických informa č ních systém ů

ostravská univerzita aplikace grafických informa č ních systém ů Každý grafický systém musí splňovat určité podmínky nutné k jeho využití. Tyto podmínky jsou dány funkcemi, které každý takový systém musí zajišťovat. Obvykle jsou definovány požadavky na implement...

Více

Multiplatformní GUI toolkity

Multiplatformní GUI toolkity pùvodní remní øe¹ení toolkitu z roku 1995 (pùvodnì rma Trolltech, nyní Qt Software)

Více

Mainlinovy kernel na telefonu Pavel Machek <pavel@ucw

Mainlinovy kernel na telefonu Pavel Machek <pavel@ucw .deb balicky, apt, X Window System "sudo gainroot" Casti jsou non-free Kernel 2.6.28 (FIXME)

Více

Bubble Trouble Uživatelská Dokumentace

Bubble Trouble Uživatelská Dokumentace V tomto okně vidíte některé nepřátele, se kterými se můžete při hře setkat (o těch později). Teď je důležité všimnout si levé části okna – úplně nahoře jsou vypínací a pauzovací tlačítko, pod tím i...

Více

Programa´torska´ dokumentace

Programa´torska´ dokumentace Qt. To nám jednoduše umožnilo přidat několik vlastnostı́, které by se jinak obtı́žně řešily. Dále jsme nechtěli využı́vat řešenı́, která by vyžadovala začleněnı́ dalšı́ch knihov...

Více

PMSDR-popis instalace

PMSDR-popis instalace stáhnout z ok-dae.unas.cz soubor sdr-shell.tar a uložit do ~/ mv /usr/local/src/sdr/sdr-shell/sdr-shell.sh /usr/local/src/sdr/sdr-shell/sdr-shell.sh-orig cd tar -xf sdr-shell.tar cp ./_sdr-shell_/*...

Více

vysoke´ucˇenítechnicke´v brneˇ

vysoke´ucˇenítechnicke´v brneˇ Pro realistické kreslení scény se postupem času vyvinulo množství metod a postupů, řešících různé aspekty problému. Liší se požadavky na reprezentaci prostorových dat, možnostmi a samozřejmě kvalit...

Více