- Co jsou to obrázky?
- Jak počítač ukládá obrázky
- Proč je pro stroj obtížné identifikovat obrázky
- Aplikace a použití OpenCV
- Instalace OpenCV s Pythonem a Anacondou
- Otevírání a ukládání obrázků v OpenCV
- Šedé měřítko obrazu v OpenCV
- Barevné prostory
- Prozkoumávání jednotlivých komponent obrazu RGB
- Převod obrazu na jednotlivé komponenty RGB
- Histogramová reprezentace obrazu
- Kreslení obrázků a tvarů pomocí OpenCV
Umění je způsob vidění a říkají, že vidění je víra, ale opak je také pravdou, víra je vidění a je opravdu těžké si představit život v tomto světě bez daru vidění - naše oči, jak úžasné je být kojencem když se naše oči jen otevřou, uvidíme svět a začneme poznávat a vidět svět kolem nás, ale jak čas plyne, stejná nádherná zkušenost se stane světskou. Ale jak postupujeme s technologií, jsme na pokraji, kde to stroje také vidí a chápou. V současné době se nezdá, že by to bylo sci-fi, kdybyste odemkli telefon obličejem, ale příběh vývoje strojového vidění se datuje dlouho před více než 20 lety.
Počáteční formální krok v této oblasti byl učiněn v roce 1999 v rámci iniciativy Intel, kdy veškerý probíhající výzkum spolupracoval v rámci OPEN CV (Open Source computer vision), původně napsaného v C ++, s jeho prvním významným vydáním 1.0 v roce 2006 v roce 2009, třetí v roce 2015 a čtvrtý právě v roce 2018. Nyní má OpenCV rozhraní C ++, Python a Java a podporuje Windows, Linux, Mac OS, iOS a Android. Lze jej tedy snadno nainstalovat na Raspberry Pi s prostředím Python a Linux. A Raspberry Pi s OpenCV a připojenou kamerou lze použít k vytvoření mnoha aplikací pro zpracování obrazu v reálném čase, jako je detekce obličeje, zámek obličeje, sledování objektů, detekce poznávací značky automobilu, domácí bezpečnostní systém atd.
Než se pustíme do učení zpracování obrazu pomocí openCV, je důležité vědět, co jsou to obrázky a jak tyto obrázky vnímají lidé a stroje.
Co jsou to obrázky?
Obrázky jsou dvourozměrné znázornění spektra viditelného světla. A spektrum viditelného světla je jen část elektromagnetického spektra ležící tam mezi infračerveným a ultrafialovým spektrem.
Jak se tvoří obrazy: - když se světlo odráží od předmětu na film, senzor nebo na sítnici.
Takto fungují naše oči, které pomocí bariéry blokují většinu světelných bodů a ponechávají malý otvor, kterým světlo může projít, se nazývá clona a vytváří velmi zaostřený obraz a je fungujícím modelem pro kameru s kolíkovou dírou, ale v kameře s kolíkovým otvorem je problém, že do clony bude vstupovat stejné množství světla, což by nemohlo být vhodné pro vytvořený film nebo obraz, také nemůžeme získat zaostřený obraz, abychom zaostřili obraz je třeba pohybovat filmem sem a tam, ale to je v mnoha situacích problematické.
Nebo můžeme tento problém vyřešit pomocí objektivů, umožňuje nám to ovládat velikost clony a ve fotografii je známá jako f Stop, obecně nižší hodnota f Stop je ve fotografii lepší.
Velikost clony nám také umožňuje dostat se do pěkné hloubky ostrosti zvané jako Bokeh ve fotografii, což nám umožňuje mít rozmazané pozadí, zatímco se soustředíme na obraz.
Jak počítač ukládá obrázky
Možná jste slyšeli o různých obrazových formátech, jako jsou.png,.jpgG atd., To vše je digitální reprezentace našeho analogového světa, počítače to dělají překladem obrazu do digitálního kódu pro uložení a poté soubor interpretují zpět do obrázku pro Zobrazit. Ale v základech používají společnou platformu pro ukládání obrázků, a totéž platí pro openCV.
OpenCV používá ve výchozím nastavení pro své obrazy barevný prostor RGB (červený, zelený a modrý), kde každá souřadnice pixelu (x, y) obsahuje 3 hodnoty v rozmezí intenzit v 8bitové formě, tj. (0-255, 2 8).
Míchání různých intenzit každé barvy nám dává celé spektrum, proto jsou tyto tři barvy v malbě nebo v umění považovány za primární barvy a všechny ostatní za sekundární, protože většinu sekundárních barev lze tvořit primárními barvami. Stejně jako u žluté máme následující hodnoty: Červená - 255; Zelená - 255; Modrá - 0.
Nyní jsou obrázky uloženy ve vícerozměrných polích. V programování je array řada kolekcí objektů. A tady se zabýváme třemi typy polí 1D, 2D a 3D, kde 'D' znamená dimenzionální.
Barevné obrázky jsou uloženy v trojrozměrných polích, kde třetí rozměry představují barvy RGB (které uvidíme později) a společně vytvářejí různou intenzitu pixelů pro obrázek, zatímco černobílé obrázky jsou uloženy ve dvourozměrných polích a také existují dva typy černobílých obrázků ve stupních šedi a binární obrázky.
Obrázky ve stupních šedi jsou vytvořeny z odstínů šedé dvojrozměrného pole, zatímco binární obrázky jsou pixely černé nebo bílé.
Proč je pro stroj obtížné identifikovat obrázky
Počítačové vidění je samo o sobě náročným úkolem, sami si dokážete představit, jak těžké je dát stroji pocit vidění, uznání a identifikaci. Následující faktory způsobují, že počítačové vidění je tak těžké.
- Omezení snímače a objektivu fotoaparátu
- Varianty pohledu
- Změna osvětlení
- Škálování
- Okluze
- Varianty tříd objektů
- Nejednoznačné obrazy / optické iluze
Aplikace a použití OpenCV
Navzdory obtížím má Computer Vision mnoho úspěšných příběhů
- Robotická navigace - auto s vlastním řízením
- Detekce a rozpoznávání tváře
- Vyhledávání obrázků ve vyhledávači
- Čtení SPZ
- Rozpoznávání rukopisu
- Snapchat & Face filtry
- Rozpoznávání objektů
- Sledování míčů a hráčů ve sportu
- A mnoho dalších!
Instalace OpenCV s Pythonem a Anacondou
OpenCV je napsán v C ++, ale je velmi těžké jej implementovat v C ++, a proto jsme se rozhodli jej implementovat pomocí jazyka na vysoké úrovni jako python, a také existují další výhody implementace OpenCV s pythonem, protože Python je jedním z nejjednodušších jazyků pro začátečníky Je také extrémně výkonný pro datové vědy a aplikace strojového učení a také ukládá obrázky do číselných polí, což nám umožňuje docela snadno provádět velmi výkonné operace.
Základní programování je užitečné při expozici matematické úrovni na střední škole, webové kameře, Pythonu 2.7 nebo 3.6 (upřednostňován je balíček Anaconda).
Krok 1. Stáhněte a nainstalujte balíček Anaconda Python
Přejděte na: https://www.anaconda.com/download a vyberte podle počasí svého počítače Windows, Linux nebo Mac a můžete si vybrat verzi python 2.7 nebo python 3.7 pro 64bitové systémy nebo 32bitové systémy, ale nyní za dny je většina systému 64bitová.
Distribuce pythonu Anaconda přichází spolu se studiem Spyder, notebooky jupyter a výzvou Anaconda, díky čemuž je python velmi přátelský k použití. K provedení příkladů bychom použili spyder studio.
Volba mezi pythonem 2.7 nebo 3.7 je zcela neutrální, ale pro příklady bychom použili python 3.7, protože je to budoucnost pythonu a převezme Python 2.7 ve formě 2020, také většina knihoven je vyvíjena v Pythonu 3.7 na mysli budoucí aspekt pythonu. Rovněž poskytuje očekávané výsledky základních matematických operací, jako je (2/5 = 2,5), zatímco python 2.7 by jej vyhodnotil na 2. Také print je považován za funkci v pythonu 3.7 (print („ahoj“)), takže programátorům dává praktické zkušenosti.
Krok 2. Vytvoření virtuální platformy s OpenCV
Chystáme se nainstalovat OpenCV vytvořením virtuální platformy pro spyder pomocí výzvy Anaconda a zde nahraného souboru YML.
Se soubory YML nainstalujeme všechny balíčky a knihovny, které by byly potřeba, ale pokud chcete nainstalovat další balíčky, můžete je snadno nainstalovat pomocí příkazu Anaconda spuštěním příkazu daného balíčku.
Přejděte na ikonu hledání v systému Windows a najděte terminál výzvy Anaconda, který najdete ve složce Anaconda, kterou jste právě nainstalovali.
Pak musíte najít stažený soubor YML a odtud máte dvě možnosti, buď změnit adresář terminálu na místo, kde je stažen váš soubor YML, nebo buď zkopírovat soubor YML do adresáře, kde je vaše anakonda nainstalována ve většině v případě, že by to bylo uvnitř jednotky C: \, po zkopírování souboru YML do zadaného umístění spusťte na příkazovém řádku následující příkaz
conda env create –f virtual_platform_windows.yml
Vzhledem k tomu, že můj systém běží na systému Windows, soubor YML a příkaz odpovídá oknům, můžete je však upravit podle svého systému nahrazením oken za linux nebo mac.
Poznámka: - V případě, že těžba balíček dává chybu dělat instalaci pytorch a numpy první a pak spustit výše uvedený příkaz.
Nyní najděte navigátor anakondy a byla by rozbalovací nabídka „Aplikace na ___“ a odtud vyberte virtuální prostředí a odtud musíte spustit studio Spyder.
A to je vše, jste připraveni začít!
Otevírání a ukládání obrázků v OpenCV
Zde vysvětlujeme některé základní příkazy a terminologii pro používání Pythonu v OpenCV. Dozvíme se o třech základních funkcích v OpenCV imread, imshow a imwrite.
# komentáře v pythonu jsou dány symbolem #
Importujte opencv v pythonu pomocí příkazu
import cv2
Načtěte obrázek pomocí 'imread' s uvedením cesty k obrázku
image = cv2.imread ('input.jpg')
Nyní je tento obrázek načten a uložen v pythonu jako proměnná, kterou jsme pojmenovali jako obrázek
Nyní pro zobrazení naší obrazové proměnné používáme 'imshow' a prvním parametrem pro funkci imshow je název zobrazený v okně obrázku a je třeba jej zadat do (''), aby reprezentoval název jako řetězec
cv2.imshow ('hello world', obrázek)
Waitkey nám umožňuje zadávat informace, když je otevřené okno s obrázkem, ponecháním prázdného místa čeká na stisknutí libovolného tlačítka před pokračováním, umístěním čísel (kromě 0), můžeme určit zpoždění, jak dlouho necháte okno otevřené (čas v milisekundách zde).
cv2.waitKey ()
'destruAllWindows' zavře všechna otevřená okna, pokud toto neumístíte, váš program přestane reagovat.
cv2.destroyAllWindows ()
, k tomu použijeme numpy, numpy je knihovna pro programování v pythonu pro přidání podpory do velkých vícerozměrných polí a matic.
import CV2 #importing NumPy dovozní NumPy jako np image = cv2.imread ('') input.jpg cv2.imshow ('hello_world', image) #shape funkce je velmi užitečná, když se díváme na několika rozměrech z pole, to vrací n-tici, která dává rozměr obrázku print (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
výstup na konzoli - (183, 275, 3), Dva rozměry obrazu jsou 183 pixelů na výšku a 275 pixelů na šířku a 3 znamená, že tento obrázek tvoří tři další komponenty (R, G, B) (zobrazuje že barevné obrázky jsou uloženy v trojrozměrných polích).
print ('Výška obrazu:', (image.shape, 'pixels')) print ('Width of image:', (image.shape, 'pixels'))
výstup z konzoly - výška obrázku: (183, 'pixely')
Šířka obrázku: (275, 'pixelů')
Uložení upraveného obrázku do OpenCV
K určení názvu souboru a obrázku, který se má uložit, používáme „imwrite“.
cv2.imwrite ('output.jpg', obrázek) cv2.imwrite ('output.png', obrázek)
První argument je název souboru, který chceme uložit, {číst nebo uložit soubor, který používáme ('') k označení jako řetězec} a druhý argument je název souboru.
OpenCV umožňuje uložit obrázek v různých formátech.
Šedé měřítko obrazu v OpenCV
Stupně šedi je proces, při kterém se obrázek převádí z plné barvy na odstíny šedé (černé a bílé)
V OpenCV mnoho funkcí obrázky před zpracováním mění ve stupních šedi. To se děje proto, že to zjednodušuje obraz, funguje téměř jako redukce šumu a prodlužuje se doba zpracování, protože v obraze je méně informací (protože obrazy ve stupních šedi jsou uloženy ve dvourozměrných polích).
import cv2 # načtěte náš vstupní obrázek image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () #použijeme cvtcolor k převodu do šedé škály grey_image = cv2.cvtColor (obrázek, cv2.COLOR_BGR2GRAY) cv2.imshow ('stupně šedi', gray_image) cv2.waitKey () cv2.destroyALLWindows ()
Jednodušší způsob, jak převést obrázek na stupně šedi, je pouze přidat argument 0 ve funkci imread vedle názvu obrázku
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy jako np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('stupně šedi', gray_image) print (gray_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Výstup z konzoly: - (183, 275, 3) - pro barevný obrázek
(183, 275) - pro obraz ve stupních šedi
Z toho tedy jasně vyplývá, že barevné obrázky jsou reprezentovány trojrozměrnými poli, zatímco obrázky v šedé stupnici dvojrozměrnými poli.
Barevné prostory
Barevné prostory jsou způsob, jakým jsou obrázky ukládány. RGB, HSV, CMYK jsou různé barevné prostory, jedná se pouze o jednoduché způsoby znázornění barev.
RGB - červená, zelená a modrá.
HSV - Odstín, sytost a hodnota.
A CMYK se běžně používá v inkoustových tiskárnách.
RGB nebo BGR barevný prostor
Výchozí barevný prostor OpenCV je RGB. RGB je aditivní barevný model, který generuje barvy kombinací modré, zelené a červené barvy různé intenzity / jasu. V OpenCV používáme 8bitové barevné hloubky.
- Červená (0-255)
- Modrá (0-255)
- Zelená (0-255)
OpenCV však ve skutečnosti ukládá barvy ve formátu BGR.
Zábavný fakt: - Používáme pořadí BGR v počítačích kvůli tomu, jak jsou nepodepsaná 32bitová celá čísla uložena v paměti, stále končí jako RGB. Celé číslo představující barvu, např.: - 0X00BBGGRR bude uloženo jako 0XRRGGBB.
HSV barevný prostorHSV (Hue, Saturation & value / Brightness) je barevný prostor, který se pokouší reprezentovat barvy, které lidé vnímají. Ukládá barevné informace ve válcovém zobrazení barevných bodů RGB.
Odstín - hodnota barvy (0-179)
Sytost - živost barev (0-255)
Hodnota - jas nebo intenzita (0-255)
Formát HSV barevného prostoru je užitečný při segmentaci barev. V RGB není filtrování konkrétní barvy snadné, ale díky HSV je mnohem snazší nastavit barevné rozsahy tak, aby filtrovaly konkrétní barvu tak, jak je vnímáme.
Odstín představuje barvu v HSV, hodnota odstínu se pohybuje v rozmezí 0 - 180 a ne 360, takže nedokončí celý kruh a je tedy mapována jinak než standard.
Filtry barevné škály
- Červená - (165-15)
- Zelená - (45-75)
- Modrá - (90–120)
Jak víme, obrázky se ukládají do barevného prostoru RGB (červená, zelená a modrá), a OpenCV nám to tedy ukazuje stejně, ale první věc, kterou si musíme pamatovat na formát RGB opencv, je, že je to vlastně BGR a můžeme to poznat pohledem na tvar obrazu.
import cv2 import numpy jako np image = cv2.imread ('input.jpg') # B, G, R hodnota pro prvních 0,0 pixelu B, G, R = tisk obrázku (B, G, R) tisk (obrázek.shape) # now if we apply this on grayscale image grey_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image hodnota pixelu pro tisk 10,50 pixelu (gray_img)
Výstup z konzoly: tisk (B, G, R) - 6 11 10
tisk (image.shape) - (183, 275, 3)
tisk (gray_img.shape) - (183, 275)
tisk (gray_img) - 69
Nyní jsou v obrazu šedé stupnice pouze dvě dimenze, protože si pamatujeme, že barevný obraz je uložen ve třech rozměrech, třetí dimenze je (R, G, B), zatímco ve stupních šedi jsou přítomny pouze dvě dimenze, protože (R, G, B) chybí a pro konkrétní polohu pixelu dostaneme pouze jednu hodnotu, zatímco v barevném obrázku máme tři hodnoty.
Dalším užitečným barevným prostorem je HSV
import cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue kanál', hsv_image) cv2. imshow ('saturační kanál', hsv_image) cv2.imshow ('hodnotový kanál', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Po spuštění kódu můžete vidět čtyři obrazy, z nichž tři jsou z jednotlivých kanálů a jeden je kombinovaný obraz HSV.
Obraz kanálu odstínu je poměrně tmavý, protože jeho hodnota se pohybuje pouze od 0 do 180.
Všimněte si také, že funkce imshow se vám snaží ukázat obrázek RGB nebo BGR, ale převod HSV jej překrývá.
Hodnotový kanál bude také kvůli jasu podobný obrazu ve stupních šedi obrazu.
Prozkoumávání jednotlivých komponent obrazu RGB
import cv2 image = cv2.imread ('input.jpg') # rozdělená funkce opencv rozděluje imageinti každý barevný index B, G, R = cv2.split (image) cv2.imshow ("červená", R) cv2.imshow ("Zelená", G) cv2.imshow ("Modrá", B) # vytvoření původního obrazu sloučením jednotlivých barevných složek sloučeno = cv2.merge () cv2.imshow ("sloučeno", sloučeno) # zesílení sloučené modré barvy = cv2.merge () cv2.imshow ("sloučeno s modrým zesílením", sloučeno) #představující tvar jednotlivých barevných složek. # výstup by měl být pouze dvourozměrný s výškou a šířkou, protože třetí prvek RGB komponenty je jednotlivě reprezentován print (B.shape) print (R.tvar) tisk (G. tvar) cv2.waitKey (0) cv2.destroyAllWindows ()
Výstup z konzoly: #dimensions of image from shape function
(183, 275)
(183, 275)
(183, 275)
Převod obrazu na jednotlivé komponenty RGB
V níže uvedeném kódu jsme vytvořili matici nul s rozměry obrazu VxŠ, nula vrátí pole naplněné nulami, ale se stejnými rozměry.
Tvarová funkce je velmi užitečná, když se díváme na rozměr obrázku, a tady jsme provedli řezání této tvarové funkce. Takže tvar by se chytit všechno až do určených míst tj aľ druhá určené body, které by byly výška a šířka obrazu jako třetí představuje RGB složku obrazu a my ji nepotřebují zde.
import cv2 import numpy jako np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow („ČERVENÁ“, cv2.merge ()) cv2.imshow („Zelená“, cv2.merge ()) cv2.imshow („Modrá“, cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Histogramová reprezentace obrazu
Histogramová reprezentace obrazu je metoda vizualizace složek obrazu.
Následující kód umožňuje analyzovat obraz prostřednictvím histogramu barev jeho kombinovaných a jednotlivých barevných složek.
import cv2 import numpy jako np # musíme vytvořit matplotlib k vytvoření histogramových grafů import matplotlib.pyplot jako plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) #we plot a histogram, ravel () zplošťuje naše obrazové pole plt.hist (image.ravel (), 256,) plt.show () #viewing oddělené barevné kanály color = ('b', 'g', 'r') # víme oddělte barvu a vykreslete každý v histogramu pro i, col in enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Pojďme pochopit funkci calcHist s každým z jejích jednotlivých parametrů
cv2.calcHist (obrázky, kanály, maska, histsize , rozsahy)
Obrázky: jedná se o zdrojový obrázek typu uint 8 nebo float 32. Měl by být uveden v hranatých závorkách, tj. „“, Které také označují jeho pole druhé úrovně, protože obrázek pro opencv jsou data ve formě pole.
Kanály: je uveden také v hranatých závorkách. Je to index kanálu, pro který histogram vypočítáváme, například pokud je vstupem obrázek ve stupních šedi, jeho hodnota je, pro barevné obrázky, které můžete předat, nebo pro výpočet histogramu modrého, zeleného a červeného kanálu.
Maska: obrázek masky. pro nalezení histogramu plného obrazu je uveden jako „žádný“. ale pokud chcete najít histogram konkrétní oblasti obrazu, musíte pro to vytvořit obrázek masky a dát jej jako masku.
Histsize: Toto představuje náš počet BIN. Je nutné, aby to bylo uvedeno v hranatých závorkách, abychom prošli celým měřítkem.
Rozsahy: Toto je obvykle náš rozsah
Kreslení obrázků a tvarů pomocí OpenCV
Níže je několik příkladů pro kreslení čar, obdélníků, mnohoúhelníků, kruhů atd. V OpenCV.
import cv2 import numpy jako np # vytvoření černého čtverce image = np.zeros ((512 512,3), np.uint8) # můžeme to také vytvořit černobíle, ale neměly by být žádné změny image_bw = np.zeros ((512 512), np.uint8) cv2.imshow ("černý obdélník (barva)", obrázek) cv2.imshow ("černý obdélník (černobíle)", image_bw)
Čára
# vytvořit čáru přes černý čtverec # cv2.line (obrázek, počáteční souřadnice, koncové souřadnice, barva, tloušťka) # nakreslení diagonální čáry o tloušťce 5 pixelů obrázek = np.zeros ((512 512,3), np.uint8) cv2.line (image, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("modrá čára", obrázek)
Obdélník
# vytvoření obdélníku přes černý čtverec # cv2.rectangle (obrázek, počáteční souřadnice, koncové souřadnice, barva, tloušťka) # nakreslení obdélníku o tloušťce 5 pixelů obrázek = np.zeros ((512 512,3), np.uint8) cv2.rectangle (obrázek, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("obdélník", obrázek)
Kruh#vytvoření kruhu přes černý čtverec # cv2.circle (obrázek, střed, poloměr, barva, výplň) image = np.zeros ((512 512,3), np.uint8) cv2.circle (obrázek, (100,100), (50), (255 127,0), - 1) cv2.imshow ("kruh", obrázek)
Polygon#creating a polygon image = np.zeros ((512,512,3), np.uint8) #lets definovat čtyři body pts = np.array (,,,], np.int32) #lets nyní mění naše body ve formě požadované polylines pts = pts.reshape ((- 1,1,2)) cv2.polylines (obrázek,, True, (0,255,255), 3) cv2.imshow ("polygon", obrázek)
Text#putting text using opencv # cv2.putText (image, 'text to display', bootom left starting point, font, size size, color, tloušťka) image = np.zeros ((512,512,3), np.uint8) cv2. putText (obrázek, "hello world", (75 290), cv2.FONT_HERSHEY_COMPLEX, 2, (100 170,0), 3) cv2.imshow ("hello world", obrázek) cv2.waitKey (0) cv2.destroyAllWindows ()
Počítačové vidění a OpenCV jsou velmi rozsáhlá témata, ale tato příručka by byla dobrým výchozím bodem pro naučení OpenCV a zpracování obrazu.