- Kaj so slike?
- Kako računalnik shranjuje slike
- Zakaj stroj težko prepozna slike
- Uporaba in uporaba OpenCV
- Namestitev OpenCV z Python in Anaconda
- Odpiranje in shranjevanje slik v OpenCV
- Sive skale slike v OpenCV
- Barvni prostori
- Raziskovanje posameznih komponent slike RGB
- Pretvorba slike v posamezno komponento RGB
- Predstavitev slike v histogramu
- Risanje slik in oblik z uporabo OpenCV
Umetnost je način gledanja in pravijo, da je videti verjeti, res pa je tudi nasprotno, verjeti je videti in res si je težko predstavljati življenje na tem svetu brez darila vida - naše oči, kako čudovito je biti dojenček ko se nam oči le odprejo, zagledamo svet in začnemo prepoznavati in videti svet okoli sebe, toda s časom ta čudovita izkušnja postane vsakdanja. Ko pa napredujemo s tehnologijo, smo na robu, kjer jo lahko vidijo in razumejo tudi stroji. Trenutno se zdi, da ni znanstvenofantastično, če telefon preprosto odklenete z obrazom, toda zgodba o razvoju strojnega vida sega že več kot 20 let nazaj.
Začetni formalni korak na tem področju je bil sprejet že leta 1999 v okviru pobude Intel, ko so bile vse raziskave, ki so se odvijale, sodelovali v okviru odprtega računalniškega vida OPEN (Open Source Computer Vision), prvotno napisanega v jeziku C ++, s prvo večjo izdajo 1.0 leta 2006 leta 2009, tretji v letu 2015 in četrti ravno zdaj v letu 2018. Zdaj ima OpenCV vmesnike C ++, Python in Java ter podpira Windows, Linux, Mac OS, iOS in Android. Tako ga je mogoče enostavno namestiti v Raspberry Pi z okoljem Python in Linux. Raspberry Pi z OpenCV in priloženo kamero lahko uporabite za ustvarjanje številnih aplikacij za obdelavo slik v realnem času, kot so zaznavanje obrazov, zaklepanje obrazov, sledenje predmetom, zaznavanje registrske tablice avtomobila, sistem za domačo varnost itd.
Preden se začnemo učiti obdelave slik z uporabo openCV, je pomembno vedeti, kaj so slike in kako jih ljudje in stroji dojemajo.
Kaj so slike?
Slike so dvodimenzionalna predstavitev spektra vidne svetlobe. In spekter vidne svetlobe je le del elektromagnetnega spektra, ki leži tam med infrardečim in ultravijoličnim spektrom.
Kako nastajajo slike: - ko se svetloba odbije od predmeta na film, senzor ali mrežnico.
Tako delujejo naše oči z uporabo pregrade, ki blokira največ točk luči, tako da se majhna odprtina, skozi katero lahko prehaja svetloba, imenuje odprtina in tvori močno fokusirano sliko in je delujoč model za kamero z luknjami, vendar je težava v fotoaparatu z luknjami, enaka količina svetlobe bo vstopila v odprtino, kar ne bi bilo primerno za film ali oblikovano sliko, prav tako ne moremo dobiti izostrene slike, da bi izostrili sliko, ki jo film je treba premikati naprej in nazaj, vendar je to v mnogih situacijah problematično.
Lahko pa to težavo odpravimo z uporabo leč, saj nam omogoča nadzor nad velikostjo zaslonke, pri fotografiji, znani kot f Stop, pa je pri fotografiranju na splošno nižja vrednost f Stop.
Velikost zaslonke nam omogoča tudi, da na fotografiji pridemo v lepo globinsko ostrino, imenovano Bokeh, omogoča nam zamegljeno ozadje, medtem ko se osredotočamo na sliko.
Kako računalnik shranjuje slike
Morda ste že slišali za različne slikovne formate, kot so.png,.jpgG itd., Vse to je digitalna predstavitev našega analognega sveta, računalniki to storijo tako, da sliko prevedejo v digitalno kodo za shranjevanje in nato datoteko razlagajo nazaj v sliko za zaslon. Toda v osnovi uporabljajo skupno platformo za shranjevanje slik, kar velja tudi za openCV.
OpenCV za svoje slike privzeto uporablja RGB (rdeči, zeleni in modri) barvni prostor, kjer vsaka koordinata slikovnih pik (x, y) vsebuje 3 vrednosti, ki se gibljejo po intenzivnosti v 8-bitni obliki, tj. (0-255, 2 8).
Mešanje različnih intenzitet posamezne barve nam daje celoten spekter, zato v slikarstvu ali umetnosti te tri barve veljajo za primarne barve, vse ostale pa kot sekundarne, ker večino sekundarnih barv lahko tvorijo osnovne barve. Tako kot pri rumeni imamo tudi naslednje vrednosti: Rdeča - 255; Zelena - 255; Modra - 0.
Zdaj so slike shranjene v večdimenzionalnih nizih. Pri programiranju je polje niz zbirk predmetov. In tu imamo opravka s tremi vrstami nizov 1D, 2D in 3D, kjer 'D' pomeni dimenzionalni.
Barvne slike so shranjene v tridimenzionalnih nizih, kjer tretja dimenzija predstavlja barve RGB (kar bomo videli kasneje), in skupaj tvorijo različno intenzivnost slikovnih pik za sliko, medtem ko so črno-bele slike shranjene v dvodimenzionalnih nizih prav tako obstajata dve vrsti črno-belih slik Sivine in binarne slike.
Slike v sivinah so oblikovane iz sivih odtenkov dvodimenzionalne matrike, medtem ko so binarne slike črnih ali belih slikovnih pik.
Zakaj stroj težko prepozna slike
Računalniški vid je že sama po sebi zahtevna naloga, sami si lahko predstavljate, kako težko je stroju dati občutek vida, prepoznavanja in identifikacije. Obstajajo naslednji dejavniki, ki otežujejo računalniški vid.
- Omejitve senzorja kamere in leče
- Razlike v stališčih
- Spreminjanje osvetlitve
- Skaliranje
- Okluzije
- Razlike v razredu predmetov
- Dvoumne slike / optične iluzije
Uporaba in uporaba OpenCV
Kljub težavam ima Computer Vision veliko zgodb o uspehu
- Robotska navigacija - samovozeči avtomobili
- Zaznavanje in prepoznavanje obrazov
- Iskanje slik iskalnika
- Branje registrske tablice
- Prepoznavanje rokopisa
- Snapchat in obrazni filtri
- Prepoznavanje predmetov
- Sledenje žogam in igralcem v športu
- In še veliko več!
Namestitev OpenCV z Python in Anaconda
OpenCV je napisan v jeziku C ++, vendar ga je zelo težko implementirati s programom C ++, zato se odločimo za njegovo izvajanje z jezikom na visoki ravni, kot je python, poleg tega pa obstajajo dodatne prednosti izvajanja OpenCV s programom python, saj je Python eden najlažjih jezikov. tudi za začetnike Izjemno zmogljiv je za uporabo na področju znanosti o podatkih in strojnega učenja, poleg tega pa slike shranjuje v numpy nizih, kar nam omogoča zelo enostavno izvajanje zelo močnih operacij.
Osnovno programiranje je koristno pri Izpostavljenosti matematiki na srednji šoli, spletni kameri, Pythonu 2.7 ali 3.6 (prednostni paket Anaconda).
Korak 1. Prenesite in namestite paket Anaconda Python
Pojdite na: https://www.anaconda.com/download in izberite glede na vremenske razmere računalnika njegova okna, Linux ali mac in lahko izberete različico python 2.7 ali python 3.7 za 64-bitne ali 32-bitne sisteme, zdaj pa na dan je večina sistema 64 bitna.
Anaconda distribucija pythona prihaja skupaj s studiem Spyder, prenosnimi računalniki jupyter in pozivom anaconda, zaradi česar je python zelo prijazen za uporabo. Za primere bi uporabili spyder studio.
Izbira med python 2.7 ali 3.7 je popolnoma nevtralna, toda za primere bi uporabili python 3.7, saj je prihodnost pythona in bo prevzel python 2.7 iz leta 2020, tudi večina knjižnic je razvitih v python 3.7 prihodnji vidik pythona v mislih. Prav tako daje tudi pričakovane rezultate pri osnovnih matematičnih operacijah, kot je (2/5 = 2,5), medtem ko bi jo python 2.7 ocenil na 2. Tudi tiskanje je v pythonu 3.7 obravnavano kot funkcija (tisk ("zdravo"), tako daje praktično delo programerjem.
Korak 2. Ustvarjanje navidezne platforme z OpenCV
OpenCV bomo namestili z ustvarjanjem navidezne platforme za spyderja s pozivom Anaconda in tukaj naloženo datoteko YML.
Z datotekami YML bomo namestili vse pakete in knjižnice, ki bi bili potrebni, če pa želite namestiti dodatne pakete, jih lahko enostavno namestite s pozivom anaconda, tako da zaženete ukaz tega paketa.
Pojdite na ikono za iskanje okna in poiščite terminal za poziv anaconda, ki ga lahko najdete v mapi, ki ste jo pravkar namestili.
Nato morate najti preneseno datoteko YML in od tu imate dve možnosti, ali spremenite imenik terminala na mesto, kjer se prenese datoteka YML, ali kopirate datoteko YML v imenik, v katerem je nameščena vaša anaconda. V primeru, da bi bil v pogonu C: \, ko kopirate datoteko YML na določeno lokacijo, zaženite naslednji ukaz v pozivu
conda env create –f virtual_platform_windows.yml
Ker se moj sistem izvaja v oknih, datoteka YML in ukaz ustreza oknom, lahko pa spremenite sistem tako, da Windows nadomestite z Linuxom ali Macom.
Opomba: - Če ekstrakcija paketa povzroči napako, najprej namestite pytorch in numpy in nato zaženite zgornji ukaz.
Zdaj poiščite navigator anaconda in prikazal bi se spustni meni »Applications on ___«, od tam izberite navidezno okolje in nato zaženite Spyder studio.
In to je to, pripravljeni ste začeti!
Odpiranje in shranjevanje slik v OpenCV
Tukaj razlagamo nekaj osnovnih ukazov in terminologije za uporabo Pythona v OpenCV. Spoznali bomo tri osnovne funkcije v OpenCV imread, imshow in imwrite.
#komentarji v pythonu so podani s simbolom #
Uvozi opencv v python z ukazom
uvoz cv2
Naložite sliko s pomočjo »imread«, ki določa pot do slike
image = cv2.imread ('input.jpg')
Zdaj je ta slika naložena in shranjena v pythonu kot spremenljivka, ki smo jo poimenovali kot slika
Zdaj za prikaz naše slikovne spremenljivke uporabimo 'imshow', prvi parameter funkcije imshow pa je naslov, prikazan v oknu slike, in ga je treba vnesti v (''), da predstavlja ime kot niz
cv2.imshow ('pozdravljeni svet', slika)
waitkey nam omogoča, da vnesemo informacije, ko je okno slike odprto, tako da ostane prazno in samo počaka, da pritisnete katero koli tipko, preden nadaljujete. Z vstavitvijo številk (razen 0) lahko določimo zamik, kako dolgo ostane okno odprto v milisekundah).
cv2.waitKey ()
'killAllWindows' zapre vsa odprta okna, če tega ne namestite, bo vaš program obesil.
cv2.destroyAllWindows ()
, za to bomo uporabili numpy, numpy je knjižnica za programiranje na python za dodajanje podpore velikim večdimenzionalnim nizom in matricam.
import cv2 #importing numpy import numpy kot np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape funkcija je zelo koristna, ko gledamo dimenzije polja, je vrne tuple, ki daje dimenzijo tiska slike (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
izhod konzole - (183, 275, 3), Dve dimenziji slike sta 183 slikovnih pik v višino in 275 slikovnih pik v širino in 3 pomeni, da obstajajo trije drugi elementi (R, G, B), ki tvorijo to sliko (prikazuje da so barvne slike shranjene v tridimenzionalnih nizih).
print ('Višina slike:', (image.shape, 'pixels')) print ('Širina slike:', (image.shape, 'pixels'))
izhod konzole - Višina slike: (183, 'slikovne pike')
Širina slike: (275, 'slikovne pike')
Shranjevanje urejene slike v OpenCV
Za določitev imena datoteke in slike, ki jo želimo shraniti, uporabljamo 'imwrite'.
cv2.imwrite ('output.jpg', slika) cv2.imwrite ('output.png', slika)
Prvi argument je ime datoteke, ki jo želimo shraniti, {za branje ali shranjevanje datoteke, ki jo uporabljamo (''), da jo označimo kot niz}, drugi argument pa je ime datoteke.
OpenCV omogoča shranjevanje slike v različnih formatih.
Sive skale slike v OpenCV
Siva skala je postopek, s katerim se slika pretvori iz barvne v sive odtenke (črno-bele)
V opencv številne funkcije pred obdelavo slike prikažejo v sivih lestvicah. To se naredi, ker sliko poenostavi, deluje skoraj kot zmanjšanje šuma in podaljša čas obdelave, saj je na sliki manj informacij (slike v sivini so shranjene v dvodimenzionalnih nizih).
uvoz cv2 # naložite našo vhodno sliko image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # uporabljamo cvtcolor, za pretvorbo v sivino Gray_image = cv2.cvtColor (slika, cv2.COLOR_BGR2GREY) cv2.imshow ('sivine', siva_slika) cv2.waitKey () cv2.destroyALLWindows ()
Preprostejši način za pretvorbo slike v sivine je samo dodati argument 0 v funkciji imread poleg imena slike
uvoz cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('sivine', siva_slika) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) cv2.imshow ('sivine', siva_slika) print (grey_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Izhod konzole: - (183, 275, 3) - za barvno sliko
(183, 275) - za sivinsko sliko
Zato jasno kaže, da so barvne slike predstavljene s tridimenzionalnimi nizi, sive slike pa z dvodimenzionalnimi nizi.
Barvni prostori
Barvni prostori so način shranjevanja slik. RGB, HSV, CMYK so različni barvni prostori, to so le preprosti načini za predstavitev barve.
RGB - rdeča, zelena in modra.
HSV - odtenek, nasičenost in vrednost.
In CMYK se pogosto uporablja pri brizgalnih tiskalnikov.
RGB ali BGR barvni prostor
Privzeti barvni prostor OpenCV je RGB. RGB je dodaten barvni model, ki ustvarja barve s kombiniranjem modre, zelene in rdeče barve različnih intenzivnosti / svetlosti. V OpenCV uporabljamo 8-bitno globino barve.
- rdeča (0-255)
- modra (0-255)
- zelena (0-255)
Vendar OpenCV dejansko shranjuje barve v formatu BGR.
Zabavno dejstvo: - V računalnikih uporabljamo vrstni red BGR, ker so nepodpisana 32-bitna cela števila shranjena v pomnilniku, vendar se na koncu shrani kot RGB. Celo število, ki predstavlja barvo, na primer: - 0X00BBGGRR bo shranjeno kot 0XRRGGBB.
HSV barvni prostorHSV (Hue, Saturation & value / Brightness) je barvni prostor, ki poskuša predstaviti barve, ki jih ljudje zaznajo. Informacije o barvah shrani v cilindrični predstavitvi barvnih točk RGB.
Odtenek - barvna vrednost (0-179)
Nasičenost - živahnost barve (0-255)
Vrednost - svetlost ali intenzivnost (0-255)
Format barvnega prostora HSV je uporaben pri segmentaciji barv. V RGB filtriranje določene barve ni enostavno, vendar HSV olajša nastavitev barvnih obsegov za filtriranje določene barve, kot jo zaznamo.
Odtenek predstavlja barvo v HSV, vrednost odtenka se giblje med 0 - 180 in ne 360, zato ne zaokroža celotnega kroga in je zato preslikana drugače kot standard.
Filtri barvnega razpona
- Rdeča - (165-15)
- Zelena - (45-75)
- Modra - (90-120)
Kot vemo, da so slike shranjene v barvnem prostoru RGB (rdeča, zelena in modra), nam OpenCV kaže enako, toda prva stvar, ki si jo moramo zapomniti pri formatu RGB opencv, je, da gre dejansko za BGR, in to lahko vemo, če pogledamo oblika slike.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R vrednost za prvih 0,0 piksla B, G, R = image print (B, G, R) print (image.shape) # zdaj, če to uporabimo na sliki sivine Gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (grey_img.shape) #gray_image vrednost piksla za tisk 10,50 pik (gray_img)
Izhod konzole: tisk (B, G, R) - 6 11 10
tisk (image.shape) - (183, 275, 3)
tisk (siva_img. oblika) - (183, 275)
tisk (grey_img) - 69
Zdaj sta na sliki sive lestvice le dve dimenziji, saj se spomnimo, da je barvna slika shranjena v treh dimenzijah, tretja dimenzija je (R, G, B), medtem ko sta v sivinah prisotni le dve dimenziji, saj (R, G, B) ni in za določen položaj slikovnih pik dobimo samo eno vrednost, medtem ko imamo na barvni sliki tri vrednosti.
Drug uporaben barvni prostor je HSV
uvoz cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('saturation channel', hsv_image) cv2.imshow ('value channel', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Po zagonu kode lahko vidite štiri slike, od katerih so tri posamezne kanale, ena pa kombinirano sliko HSV.
Slika odtenka kanala je precej temna, saj se njena vrednost spreminja le od 0 do 180.
Upoštevajte tudi, da vam funkcija imshow poskuša prikazati sliko RGB ali BGR, vendar se pretvorba HSV prekriva.
Tudi vrednostni kanal bo zaradi svoje svetlosti podoben sivinam slike.
Raziskovanje posameznih komponent slike RGB
import cv2 image = cv2.imread ('input.jpg') # funkcija splitc opencv razdeli sliko na vsak barvni indeks B, G, R = cv2.split (slika) cv2.imshow ("Rdeča", R) cv2.imshow ("Zeleni", G) cv2.imshow ("Blue", B) #making originalno sliko z združitvijo posameznih barvnih komponent združenega = cv2.merge () cv2.imshow ("združeni", združeni) #amplifying modra barva združena = cv2.merge () cv2.imshow ("združeno z modrim ojačanjem, združeno) # predstavljanje oblike posameznih barvnih komponent. # izhodna vrednost bi bila le dve dimenziji, ki bi bila višina in širina, saj je tretji element komponente RGB posamično predstavljen tisk (B. oblika) tisk (R.oblika) tisk (G.oblika) cv2.waitKey (0) cv2.destroyAllWindows ()
Izhod konzole: #dimenzije slike iz funkcije oblike
(183, 275)
(183, 275)
(183, 275)
Pretvorba slike v posamezno komponento RGB
V spodnji kodi smo ustvarili matrico ničel z dimenzijami slike HxW, nič vrne matriko, napolnjeno z ničlami, vendar z enakimi dimenzijami.
Funkcija oblike je zelo koristna, ko gledamo dimenzijo slike, in tu smo opravili rezanje te funkcije oblike. Torejbi oblika zajela vse do določenih točk, tj.Dosekund določenih točk, ki bi bili višina in širina slike, saj tretja predstavlja RGB komponento slike in je tukaj ne potrebujemo.
uvoz cv2 uvoz numpy kot np image = cv2.imread ('input.jpg') B, G, R = cv2.split (slika) ničle = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("RDEČA", cv2.merge ()) cv2.imshow ("Zelena", cv2.merge ()) cv2.imshow ("Modra", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Predstavitev slike v histogramu
Histogramska predstavitev slike je metoda vizualizacije komponent slike.
Naslednja koda vam omogoča analizo slike s pomočjo barvnega histograma njegovih kombiniranih in posameznih barvnih komponent.
import cv2 import numpy kot np # moramo uvesti matplotlib, da ustvarimo grafikone histogramov import matplotlib.pyplot kot plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # načrtujemo histogram, ravel () flatens naše slikovno polje plt.hist (image.ravel (), 256,) plt.show () # ogled ločenih barvnih kanalov color = ('b', 'g', 'r') # vemo ločite barvo in narišite vsako v histogramu za i, col v enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Dajmo razumeti calcHist funkcije z vsako od posameznih parametrov
cv2.calcHist (slike, kanali, maska, histsize , obsegi)
Slike: je izvorna slika tipa uint 8 ali float 32. Podati jo je treba v oglatih oklepajih, tj. "", Kar pomeni tudi njeno matriko druge ravni, ker je slika za opencv podatki v obliki matrike.
Kanali: podan je tudi v oglatih oklepajih. To je indeks kanala, za katerega izračunamo histogram, na primer, če je vnos sive slike, je njegova vrednost za barvne slike, ki jih lahko prenesemo, ali za izračun histograma modrega, zelenega in rdečega kanala.
Maska: slika maske. da bi našli histogram celotne slike, je podan kot "nič". če pa želite najti histogram določenega področja slike, morate za to ustvariti sliko maske in jo dati kot masko.
Histsize: To predstavlja naše BIN štetje. Potrebno ga je dati v oglatih oklepajih za celoten obseg, ki ga opravimo.
Dosegi: To je naš domet, običajno je
Risanje slik in oblik z uporabo OpenCV
Spodaj je nekaj primerov za risanje črt, pravokotnika, mnogokotnika, kroga itd. V OpenCV.
import cv2 import numpy as np #creating a black square image = np.zeros ((512,512,3), np.uint8) # to lahko ustvarimo tudi črno-belo, vendar ne bi prišlo do sprememb image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("črni pravokotnik (barva)", slika) cv2.imshow ("črni pravokotnik (črno-belo)", image_bw)
Vrstica
# ustvari črto čez črni kvadrat # cv2.line (slika, začetne koordinate, končne koordinate, barva, debelina) # risanje diagonalne črte debeline 5 slikovnih pik image = np.zeros ((512,512,3), np.uint8) cv2.line (slika, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("modra črta", slika)
Pravokotnik
# ustvari pravokotnik nad črnim kvadratom # cv2.rectangle (slika, začetne koordinate, končne koordinate, barva, debelina) # risanje pravokotnika debeline 5 slikovnih pik image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (slika, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("pravokotnik", slika)
Krog# ustvarjanje kroga nad črnim kvadratom # cv2.circle (slika, sredina, polmer, barva, polnilo) image = np.zeros ((512,512,3), np.uint8) cv2.circle (slika, (100.100), (50), (255.127,0), - 1) cv2.imshow ("krog", slika)
Poligon#creating the polygon image = np.zeros ((512,512,3), np.uint8) #lets definirajo štiri točke pts = np.array (,,,], np.int32) #lets zdaj preoblikujejo naše točke v obliki, ki jo zahteva polilini pts = pts.reshape ((- 1,1,2)) cv2.polylines (slika,, True, (0,255,255), 3) cv2.imshow ("poligon", slika)
Besedilo# vnos besedila z uporabo opencv # cv2.putText (slika, 'besedilo za prikaz', zagonsko levo izhodišče, pisava, velikost pisave, barva, debelina) image = np.zeros ((512,512,3), np.uint8) cv2. putText (image, "hello world", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hello world", image) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision in OpenCV sta zelo obsežni temi, ki bi ju lahko zajeli, vendar bi bilo to vodilo dobro izhodišče za učenje OpenCV in obdelave slik.