- Cosa sono le immagini?
- Come il computer memorizza le immagini
- Perché è difficile per una macchina identificare le immagini
- Applicazione e usi di OpenCV
- Installazione di OpenCV con Python e Anaconda
- Apertura e salvataggio di immagini in OpenCV
- Immagine in scala di grigi in OpenCV
- Spazi colore
- Esplorazione dei singoli componenti dell'immagine RGB
- Conversione dell'immagine in un singolo componente RGB
- Rappresentazione dell'istogramma dell'immagine
- Disegnare immagini e forme utilizzando OpenCV
L'arte è un modo di vedere e si dice che vedere per credere, ma è vero anche il contrario, credere è vedere ed è davvero difficile immaginare di vivere in questo mondo senza il dono della visione: i nostri occhi, quanto è meraviglioso essere un bambino quando i nostri occhi si aprono appena vediamo il mondo e iniziamo a riconoscere e vedere il mondo che ci circonda, ma col passare del tempo, la stessa meravigliosa esperienza diventa banale. Ma mentre progrediamo con la tecnologia, siamo al punto in cui le macchine sono anche in grado di vederla e capirla. Al momento, non sembra essere una fantascienza se sblocchi il telefono semplicemente con la tua faccia, ma la storia dello sviluppo della visione artificiale risale a più di 20 anni fa.
Il passo formale iniziale in questo campo è stato ripreso nel 1999 in un'iniziativa Intel, quando tutta la ricerca in corso è stata collaborata sotto il CV OPEN (visione computerizzata Open Source), originariamente scritto in C ++, con la sua prima major release 1.0 nel 2006 secondo nel 2009, terzo nel 2015 e quarto solo ora nel 2018. Ora OpenCV ha interfacce C ++, Python e Java e supporta Windows, Linux, Mac OS, iOS e Android. Quindi può essere facilmente installato in Raspberry Pi con Python e ambiente Linux. E Raspberry Pi con OpenCV e telecamera collegata può essere utilizzato per creare molte applicazioni di elaborazione delle immagini in tempo reale come Face Detection, Face Lock, Object Tracking, Auto Number Plate Detection, Home Security System, ecc.
Prima di apprendere l' elaborazione delle immagini utilizzando openCV è importante sapere cosa sono le immagini e come gli esseri umani e le macchine percepiscono quelle immagini.
Cosa sono le immagini?
Le immagini sono una rappresentazione bidimensionale dello spettro della luce visibile. E lo spettro della luce visibile è solo una parte dello spettro elettromagnetico che si trova tra lo spettro infrarosso e quello ultravioletto.
Come si formano le immagini: - quando una luce si riflette su un oggetto su una pellicola, un sensore o sulla retina.
Questo è il modo in cui funzionano i nostri occhi, utilizzando una barriera per bloccare la maggior parte delle luci lasciando una piccola apertura attraverso la quale la luce può passare, viene chiamata apertura e forma un'immagine molto focalizzata ed è un modello funzionante per una fotocamera a foro di spillo, ma c'è un problema in una fotocamera pin hole, quella stessa quantità di luce entrerà nell'apertura, il che potrebbe non essere adatto per il film o l'immagine formata inoltre non possiamo ottenere un'immagine a fuoco, quindi per mettere a fuoco l'immagine noi è necessario spostare la pellicola avanti e indietro, ma questo è problematico in molte situazioni.
Oppure possiamo risolvere questo problema usando gli obiettivi, ci permette di controllare la dimensione dell'apertura, e in fotografia è noto come f Stop, generalmente abbassare il valore di f Stop è meglio in fotografia.
La dimensione dell'apertura ci permette anche di entrare in una bella profondità di campo chiamata Bokeh in fotografia, ci permette di avere uno sfondo sfocato mentre ci concentriamo sull'immagine.
Come il computer memorizza le immagini
Potresti aver sentito parlare di vari formati di immagine come.png,.jpgG e così via, tutto questo è una rappresentazione digitale del nostro mondo analogico, i computer lo fanno traducendo l'immagine in codice digitale per l'archiviazione e quindi interpretano il file in un'immagine per Schermo. Ma alla base usano una piattaforma comune per memorizzare le immagini, e lo stesso vale per openCV.
OpenCV utilizza lo spazio colore RGB (rosso, verde e blu) per impostazione predefinita per le sue immagini, dove ogni coordinata pixel (x, y) contiene 3 valori che vanno per intensità in forma di 8 bit, cioè (0-255, 2 8).
Mescolare diverse intensità di ogni colore ci dà lo spettro completo, ecco perché nella pittura o nell'arte questi tre colori sono considerati colori primari e tutti gli altri come secondari, perché la maggior parte dei colori secondari può essere formata da colori primari. Come per il giallo, abbiamo i seguenti valori: Rosso - 255; Verde - 255; Blu - 0.
Ora le immagini vengono memorizzate in array multidimensionali. Nella programmazione, array è una serie di raccolte di oggetti. E qui abbiamo a che fare con tre tipi di array 1D, 2D e 3D dove "D" sta per dimensionale.
Le immagini colorate sono memorizzate in array tridimensionali, dove la terza dimensione rappresenta i colori RGB (che vedremo più avanti), e insieme formano diverse intensità di pixel per un'immagine, mentre le immagini in bianco e nero sono memorizzate in array bidimensionali e ci sono anche due tipi di immagini in bianco e nero in scala di grigi e immagini binarie.
Le immagini in scala di grigi sono formate dalle sfumature di grigio di una matrice bidimensionale, mentre le immagini binarie sono di pixel di bianco o nero.
Perché è difficile per una macchina identificare le immagini
La visione artificiale è di per sé un compito impegnativo, puoi immaginare quanto sia difficile dare a una macchina un senso di visione, riconoscimento e identificazione. I seguenti fattori sono lì che rendono la visione artificiale così difficile.
- Sensore della fotocamera e limitazioni dell'obiettivo
- Visualizza le variazioni dei punti
- Cambiare l'illuminazione
- Ridimensionamento
- Occlusioni
- Variazioni della classe di oggetti
- Immagini ambigue / illusioni ottiche
Applicazione e usi di OpenCV
Nonostante la difficoltà, Computer Vision ha molte storie di successo
- Navigazione robotica - Auto a guida autonoma
- Rilevamento e riconoscimento dei volti
- Ricerca di immagini del motore di ricerca
- Lettura targa
- Riconoscimento della grafia
- Snapchat e filtri viso
- Riconoscimento degli oggetti
- Monitoraggio della palla e del giocatore nello sport
- E molti altri!
Installazione di OpenCV con Python e Anaconda
OpenCV è scritto in C ++, ma è molto difficile implementarlo con C ++ e quindi scegliamo di implementarlo con un linguaggio di alto livello come python, e ci sono anche ulteriori vantaggi nell'implementare OpenCV con python poiché Python è uno dei linguaggi più semplici anche per i principianti È estremamente potente per applicazioni di scienza dei dati e apprendimento automatico e memorizza anche le immagini in array numpy che ci consentono di eseguire alcune operazioni molto potenti abbastanza facilmente.
La programmazione di base è utile con Exposure to High School Level Math, una webcam, Python 2.7 o 3.6 (è preferibile il pacchetto Anaconda).
Passaggio 1. Scarica e installa il pacchetto Anaconda Python
Vai su: https://www.anaconda.com/download e scegli in base al tempo della tua macchina le sue finestre, Linux o mac e puoi scegliere la versione python 2.7 o python 3.7 per sistemi a 64 bit o sistemi a 32 bit, ma ora un giorno la maggior parte del sistema è a 64 bit.
La distribuzione Anaconda di python arriva insieme a Spyder studio, jupyter notebook e anaconda prompt, che rende python super facile da usare. Useremo Spyder Studio per fare gli esempi.
La scelta tra python 2.7 o 3.7 è completamente neutra, ma tuttavia per gli esempi utilizzeremmo python 3.7 poiché è il futuro di python e assumeremo python 2.7 dal 2020, inoltre la maggior parte delle librerie sono sviluppate in python 3.7 mantenendo l'aspetto futuro di python in mente. Inoltre fornisce anche i risultati attesi su operazioni matematiche di base come (2/5 = 2.5), mentre python 2.7 lo valuterebbe a 2. Anche print è trattata come una funzione in python 3.7 (print ("hello")), quindi dà le mani ai programmatori.
Passaggio 2. Creazione di una piattaforma virtuale con OpenCV
Stiamo per installare OpenCV con la creazione di una piattaforma virtuale per spyder utilizzando Anaconda pronta e il file caricato YML qui.
Con i file YML installeremo tutti i pacchetti e le librerie che sarebbero necessari, ma comunque se vuoi installare eventuali pacchetti aggiuntivi puoi facilmente installare tramite il prompt di anaconda, eseguendo il comando di quel pacchetto.
Vai all'icona di ricerca di Windows e trova il terminale del prompt di anaconda, puoi trovarlo nella cartella anaconda che hai appena installato.
Quindi devi trovare il tuo file YML scaricato, e da qui hai due scelte o cambiare la directory del tuo terminale nella posizione in cui è stato scaricato il tuo file YML o copiare il tuo file YML nella directory in cui il tuo anaconda è installato più casi sarebbe all'interno di C: \ drive, dopo aver copiato il file YML nella posizione specificata ESEGUI il seguente comando sul tuo prompt
conda env create –f virtual_platform_windows.yml
Dato che il mio sistema gira su Windows, il file YML e il comando corrispondono alle finestre, tuttavia puoi modificare in base al tuo sistema sostituendo Windows con Linux o Mac come rispettivo.
Nota: - Se l'estrazione del pacchetto dà un errore, installare prima pytorch e numpy e quindi eseguire il comando precedente.
Ora trova il navigatore anaconda e ci sarebbe un menu a tendina di "Applicazioni su ___" e da lì seleziona l'ambiente virtuale e poi da lì devi avviare Spyder studio.
Ed è tutto, sei pronto per iniziare!
Apertura e salvataggio di immagini in OpenCV
Qui stiamo spiegando alcuni comandi e terminologia di base per utilizzare Python in OpenCV. Impareremo tre funzioni di base in OpenCV imread, imshow e imwrite.
#commenti in python sono dati dal simbolo #
Importa opencv in python tramite comando
importa cv2
Carica un'immagine usando 'imread' specificando il percorso dell'immagine
immagine = cv2.imread ('input.jpg')
Ora quell'immagine è caricata e memorizzata in python come una variabile che abbiamo chiamato come immagine
Ora per visualizzare la nostra variabile immagine, usiamo 'imshow' e il primo parametro per la funzione imshowèil titolo mostrato nella finestra dell'immagine, e deve essere inserito in ('') per rappresentare il nome come una stringa
cv2.imshow ('ciao mondo', immagine)
waitkey ci permette di inserire informazioni quando la finestra dell'immagine è aperta, lasciandola vuota aspetta solo che venga premuto un tasto prima di continuare, inserendo numeri (tranne 0), possiamo specificare un ritardo per quanto tempo mantieni la finestra aperta (tempo in millisecondi qui).
cv2.waitKey ()
'destroyAllWindows' chiude tutte le finestre aperte, il mancato posizionamento causerà il blocco del programma.
cv2.destroyAllWindows ()
, per questo useremo numpy, numpy è una libreria per la programmazione Python per l'aggiunta del supporto a grandi array e matrici multidimensionali.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) La funzione #shape è molto utile quando guardiamo le dimensioni di un array, restituisce una tupla che fornisce una dimensione di un'immagine print (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
output della console - (183, 275, 3), Le due dimensioni dell'immagine sono 183 pixel di altezza e 275 pixel di larghezza e 3 significa che ci sono altri tre componenti (R, G, B) che rendono questa immagine (mostra che le immagini colorate siano memorizzate in array tridimensionali).
print ('Altezza dell'immagine:', (image.shape, 'pixel')) print ('Larghezza dell'immagine:', (image.shape, 'pixel'))
output della console - Altezza dell'immagine: (183, "pixel")
Larghezza dell'immagine: (275, "pixel")
Salvataggio dell'immagine modificata in OpenCV
Usiamo 'imwrite' per specificare il nome del file e l'immagine da salvare.
cv2.imwrite ('output.jpg', immagine) cv2.imwrite ('output.png', immagine)
Il primo argomento è il nome del file che vogliamo salvare, {per leggere o per salvare il file che usiamo ('') per indicarlo come una stringa} e il secondo argomento è il nome del file.
OpenCV ti consente di salvare l'immagine in diversi formati.
Immagine in scala di grigi in OpenCV
La scala dei grigi è il processo mediante il quale un'immagine viene convertita da un colore pieno a sfumature di grigio (bianco e nero)
In opencv, molte funzioni ridimensionano le immagini prima dell'elaborazione. Questo viene fatto perché semplifica l'immagine, agendo quasi come una riduzione del rumore e aumentando il tempo di elaborazione in quanto vi sono meno informazioni nell'immagine (poiché le immagini in scala di grigi sono memorizzate in array bidimensionali).
import cv2 # carica la nostra immagine di input image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # usiamo cvtcolor, per convertire in scala di grigi gray_image = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY) cv2.imshow ('scala di grigi', gray_image) cv2.waitKey () cv2.destroyALLWindows ()
Il modo più semplice per convertire un'immagine in scala di grigi è semplicemente aggiungere l'argomento 0 nella funzione imread al nome dell'immagine
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy come 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 ('scala di grigi', gray_image) print (gray_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Uscita console: - (183, 275, 3) - per immagini a colori
(183, 275) - per immagini in scala di grigi
Quindi mostra chiaramente che le immagini colorate sono rappresentate da array tridimensionali, mentre le immagini in scala di grigi da array bidimensionali.
Spazi colore
Gli spazi colore sono il modo in cui le immagini vengono memorizzate. RGB, HSV, CMYK sono i diversi spazi colore, questi sono solo semplici modi per rappresentare il colore.
RGB: rosso, verde e blu.
HSV - Tonalità, saturazione e valore.
E CMYK è comunemente usato nelle stampanti a getto d'inchiostro.
Spazio colore RGB o BGR
Lo spazio colore predefinito di OpenCV è RGB. RGB è un modello di colore additivo che genera colori combinando colori blu, verde e rosso di diversa intensità / luminosità. In OpenCV utilizziamo profondità di colore a 8 bit.
- Rosso (0-255)
- Blu (0-255)
- Verde (0-255)
Tuttavia OpenCV memorizza effettivamente il colore in formato BGR.
Fatto divertente: - Usiamo l'ordine BGR nei computer a causa del modo in cui gli interi a 32 bit senza segno vengono archiviati in memoria, ma finisce comunque per essere archiviato come RGB. Il numero intero che rappresenta un colore, ad esempio: - 0X00BBGGRR verrà memorizzato come 0XRRGGBB.
Spazio colore HSVHSV (Hue, Saturation & value / Brightness) è uno spazio colore che tenta di rappresentare i colori che gli umani percepiscono. Memorizza le informazioni sul colore in una rappresentazione cilindrica dei punti di colore RGB.
Tonalità - valore del colore (0-179)
Saturazione - Vivacità del colore (0-255)
Valore - Luminosità o intensità (0-255)
Il formato spazio colore HSV è utile nella segmentazione del colore. In RGB, filtrare un colore specifico non è facile, tuttavia HSV rende molto più semplice impostare gli intervalli di colori per filtrare il colore specifico come li percepiamo.
La tonalità rappresenta il colore in HSV, il valore della tonalità è compreso tra 0 e 180 e non 360, quindi non sta completando il cerchio completo e quindi è mappato in modo diverso dallo standard.
Filtri della gamma di colori
- Rosso - (165-15)
- Verde - (45-75)
- Blu - (90-120)
Come sappiamo le immagini vengono memorizzate nello spazio colore RGB (rosso, verde e blu) e quindi OpenCV ci mostra lo stesso, ma la prima cosa da ricordare sul formato RGB di opencv è che in realtà è BGR e possiamo saperlo guardando il forma dell'immagine.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R valore per il primo 0,0 pixel B, G, R = immagine print (B, G, R) print (immagine.shape) #ora se applichiamo questo su un'immagine in scala di grigi gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image valore del pixel per la stampa di 10,50 pixel (gray_img)
Uscita console: stampa (B, G, R) - 6 11 10
print (image.shape) - (183, 275, 3)
print (gray_img.shape) - (183, 275)
print (gray_img) - 69
Ora ci sono solo due dimensioni in un'immagine in scala di grigi, poiché ricordiamo che l'immagine a colori è memorizzata in tre dimensioni, la terza dimensione è la (R, G, B) mentre in scala di grigi sono presenti solo due dimensioni, poiché (R, G, B) è assente e per una particolare posizione di pixel otteniamo un solo valore mentre nell'immagine a colori abbiamo tre valori.
Un altro spazio colore utile è 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 channel', hsv_image) cv2. imshow ('canale di saturazione', hsv_image) cv2.imshow ('canale valore', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Dopo aver eseguito il codice è possibile vedere le quattro immagini di cui tre sono dei singoli canali e una è combinata con l'immagine HSV.
L'immagine del canale tonalità è piuttosto scura perché il suo valore varia solo da 0 a 180.
Inoltre, nota che la funzione imshow cerca di mostrarti l'immagine RGB o BGR, ma la conversione HSV si sovrappone ad essa.
Inoltre, il canale del valore sarà simile alla scala di grigi dell'immagine a causa della sua luminosità.
Esplorazione dei singoli componenti dell'immagine RGB
import cv2 image = cv2.imread ('input.jpg') # la funzione split di opencv divide l'immagine con ogni indice di colore B, G, R = cv2.split (immagine) cv2.imshow ("Red", R) cv2.imshow ("Green", G) cv2.imshow ("Blue", B) #creare l'immagine originale unendo i singoli componenti del colore merged = cv2.merge () cv2.imshow ("merged", merged) #amplificazione del colore blu unito = cv2.merge () cv2.imshow ("merged with blue amplify", merged) # rappresenta la forma dei singoli componenti del colore. # l'output potrebbe essere solo due dimensioni che sarebbero altezza e larghezza, poiché il terzo elemento del componente RGB è rappresentato individualmente print (B.shape) print (R.forma) stampa (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Output della console: #dimensioni dell'immagine dalla funzione forma
(183, 275)
(183, 275)
(183, 275)
Conversione dell'immagine in un singolo componente RGB
Nel codice sottostante abbiamo creato una matrice di zeri con le dimensioni dell'immagine HxW, zero restituisce un array riempito di zeri ma con le stesse dimensioni.
La funzione forma è molto utile quando guardiamo la dimensione di un'immagine, e qui abbiamo eseguito il taglio di quella funzione forma. Quindi la forma afferrerebbe tutto fino ai punti designati, cioè fino ai secondi punti designati che sarebbero l'altezza e la larghezza dell'immagine poiché il terzo rappresenta la componente RGB dell'immagine e non ne abbiamo bisogno qui.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("RED", cv2.merge ()) cv2.imshow ("Green", cv2.merge ()) cv2.imshow ("Blue", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Rappresentazione dell'istogramma dell'immagine
La rappresentazione dell'istogramma dell'immagine è il metodo per visualizzare i componenti delle immagini.
Il codice seguente consente di analizzare l'immagine tramite l'istogramma del colore dei suoi componenti di colore combinati e individuali.
importa cv2 importa numpy come np # dobbiamo importare matplotlib per creare grafici di istogrammi importa matplotlib.pyplot come plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, Nessuno,,) # tracciamo un istogramma, ravel () appiattisce il nostro array di immagini plt.hist (image.ravel (), 256,) plt.show () #visualizzare canali di colore separati color = ('b', 'g', 'r') #sappiamo separare il colore e tracciare ciascuno nell'istogramma per i, col in enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Comprendiamo la funzione calcHist con ciascuno dei suoi singoli parametri
cv2.calcHist (immagini, canali, maschera, histsize , intervalli)
Immagini: è l'immagine sorgente di tipo uint 8 o float 32. Dovrebbe essere data tra parentesi quadre, cioè "", che indica anche il suo array di secondo livello poiché un'immagine per opencv è dati in una forma di array.
Canali: è indicato anche tra parentesi quadre. È l'indice del canale per il quale calcoliamo l'istogramma, ad esempio se l'input è un'immagine in scala di grigi il suo valore è, per le immagini a colori che puoi passare, o per calcolare l'istogramma del canale blu, verde e rosso rispettivamente.
Maschera: immagine maschera. per trovare l'istogramma dell'immagine intera, è dato come "nessuno". ma se vuoi trovare l'istogramma di una particolare regione dell'immagine, devi creare un'immagine maschera per quella e dargli una maschera.
Histsize: rappresenta il nostro conteggio BIN. Necessario da dare tra parentesi quadre per il fondo scala che passiamo.
Gamme: questa è la nostra gamma, normalmente lo è
Disegnare immagini e forme utilizzando OpenCV
Di seguito sono riportati alcuni esempi per disegnare linee, rettangoli, poligoni, cerchi ecc. In OpenCV.
import cv2 import numpy come np #creazione di un'immagine quadrata nera = np.zeros ((512,512,3), np.uint8) # possiamo anche creare questo in bianco e nero, tuttavia non ci sarebbero modifiche image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("black rectangle (color)", image) cv2.imshow ("black rectangle (B&W)", image_bw)
Linea
#crea una linea sul quadrato nero # cv2.line (immagine, coordinate iniziali, coordinate finali, colore, spessore) #traccia una linea diagonale di spessore 5 pixel image = np.zeros ((512,512,3), np.uint8) cv2.line (immagine, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("linea blu", immagine)
Rettangolo
#crea un rettangolo su un quadrato nero # cv2.rectangle (immagine, coordinate iniziali, coordinate finali, colore, spessore) #disegno di un rettangolo di spessore 5 pixel image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (image, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("rectangle", image)
Cerchio#creazione di un cerchio su un quadrato nero # cv2.circle (image, center, radius, color, fill) image = np.zeros ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("circle", immagine)
Poligono#creazione di un'immagine poligonale = np.zeros ((512,512,3), np.uint8) #let definiscono quattro punti pts = np.array (,,,], np.int32) #lascia ora rimodellare i nostri punti nella forma richiesta polylines pts = pts.reshape ((- 1,1,2)) cv2.polylines (image,, True, (0,255,255), 3) cv2.imshow ("polygon", image)
Testo#putting text using opencv # cv2.putText (image, 'text to display', bootom left starting point, font, font size, color, thick ) image = np.zeros ((512,512,3), np.uint8) cv2. putText (immagine, "ciao mondo", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("ciao mondo", immagine) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision e OpenCV sono argomenti molto vasti da trattare, ma questa guida sarebbe un buon punto di partenza per imparare OpenCV e l'elaborazione delle immagini.