giovedì 7 maggio 2015

Esercizio - 10 - Template Matching

import cv2
import numpy as np

img = cv2.imread('stadio_folla2.jpg',1) # carica l'immagine
imgBN = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # converte l'immagine letta in una in scala di grigi...

template = cv2.imread('stadio_persona.jpg',01) # carica l'immagine del template
templateBN = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) # converte l'immagine letta in una in scala di grigi...
w, h = templateBN.shape [::-1] # ottiene informazioni sulla larghezza e sull'altezza del template

# Applica il template Matching (con il metodo TM_CCOEFF_NORMED)
res = cv2.matchTemplate(imgBN,templateBN,cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

print ("valore massimo del matching: "+str(max_val))

# Disegna un rettangolo intorno al template trovato
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, [255,255,0], 2)

cv2.imshow("Immagine Originale",img)
cv2.imshow("template",template)
cv2.imshow("risultato matching",res)

k = cv2.waitKey(0) # attende che venga premuto un tasto
cv2.destroyAllWindows() # ...chiude tutte le finestre

Esercizio 6 - Apertura di un file video

In questo esempio vedremo come aprire e visualizzare un file video e come fare per applicare le nozioni fino qui apprese per l'elaborazione delle immagini; modificare questo esempio utilizzando le informazioni apprese precedentemente per i prossimi 3 esercizi:

  • Esercizio 7: conversione in scala di grigi
  • Esercizio 8: rilevamento della soglia
  • Esercizio 9: color detection

Una prima modifica (miglioramento) a questo esempio di base consiste nel realizzare una "uscita pulita" dal programma: attualmente l'esecuzione viene interrotta da un messaggio di errore a fine file...
Un indizio: ret=True se l'acquisizione del frame è andata a buon fine, ret=False altrimenti...
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import cv2

print ("Apertura del file video...")
cap = cv2.VideoCapture('tratto2.m4v')

if cap.isOpened()==False:
 print ("ERRORE nell'apertura del file!")
 print ("controlla meglio il nome del file")
 print ("controlla il dispositivo...")
 
while(cap.isOpened()):
 # cattura un frame dal flusso video e la memorizza in 'frame'
 ret, frame = cap.read()
 
 ###############################################
 # ... inserire qui eventuali elaborazioni ... #
 ###############################################
  
 # visualizza il frame del video
 cv2.imshow('frame',frame)
 
 k=cv2.waitKey(33)
 tasto=chr(k & 255)
 
 if cv2.waitKey(1) & 0xFF == ord('q'): # se è stato premuto il tasto 'q'
         break # allora esce dal ciclo di riproduzione

cap.release()

cv2.destroyAllWindows() # ...chiude tutte le finestre

lunedì 4 maggio 2015

Esercizio 5 - contorni

L'esercizio che segue utilizza la funzione cv2.Canny() per ottenere i contorni da un'immagine, occorre fornire in ingresso un'immagine in scala di grigi.
L'immagine prodotta sarà in bianco e nero.
Nella parte seguente del codice la funzione cv2.dilation() allarga le zone bianche utilizzando una matrice ausiliare come se fosse un "pennarello" con cui ripassare l'immagine...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2
import numpy as np

img = cv2.imread("test2.jpg",1)  # legge una immagine da un file
cv2.imshow('Immagine caricata dal file.',img) # mostra l'immagine in una finestra

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # converte l'immagine caricata in una in scala di grigi...

# estrae i controni dall'immagine
edges = cv2.Canny(gray_image,100,200)  

# ripassa le parti bianche inspessendole
kernel = np.ones((5,5),np.uint8) # matrice-"pennarello" con cui eseguire il ripasso...
dilation = cv2.dilate(edges,kernel,iterations = 1) # funzione di dilatazione

cv2.imshow('Controni',edges) # mostra i contorni in una finestra
cv2.imshow('Controni Allargati',dilation) # mostra il tratto inspessito

k = cv2.waitKey(0) # attende che venga premuto un tasto
cv2.destroyAllWindows() # ...chiude tutte le finestre

Esercizio 4 - Color detection

Questo esercizio ha lo scopo di individuare un colore prestabilito in una immagine e calcolarne il "centro", o più correttamente il "centroide". Per compiere questa operazione si utilizza lo "spazio di colore HSV".
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2
import numpy as np

# legge una immagine da un file
img = cv2.imread("tratto.jpg",1) 

# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# definisce un intervallo di colore nello spazio HSV
verde_min = np.array([33,96,94],np.uint8)   #############################
verde_max = np.array([87,255,255],np.uint8) #############################

# soglia che prende solo l'area compresa tra i due livelli di colore
mask = cv2.inRange(hsv, verde_min, verde_max)

# cerca il centro (centroide) dell'area evidenziata
M = cv2.moments(mask, 0) 
cx,cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])

# disegna un cerchio:
#  (immagine, centro, raggio, colore(BGR), spessore)
cv2.circle(img,(cx,cy),20,(0,0,255),2) 

## Visualizza le immagini nelle varie finestre
cv2.imshow('Immagine caricata dal file...',img) 
cv2.imshow('mask',mask)

# attende che venga premuto un tasto
k = cv2.waitKey(0) 
# ...chiude tutte le finestre
cv2.destroyAllWindows() 

Esercizio 3 - Soglia

In questo esercizio, introduciamo la funzione:
 cv2.threshold(img , val_rif , val_assegnato , modalità) 
Il suo funzionamento è molto semplice: accetta, tra i parametri di input, l'immagine in scala di grigi da elaborare (img) e genera in uscita una immagine i cui pixel possono assumere solo 2 valori: '0' se sono al di sotto di val_rif oppure val_assegnato per tutti i pixel dell'immagine originale che superano val_rif.

Le modalità di funzionamento possono essere:

  1. cv2.THRESH_BINARY
  2. cv2.THRESH_BINARY_INV
  3. cv2.THRESH_TRUNC
  4. cv2.THRESH_TOZERO
  5. cv2.THRESH_TOZERO_INV
Di cui risparmio la trattazione esaustiva, lasciandovi la possibilità di esplorare e scoprirne il funzionamento...

Ecco il codice di esempio:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("test1.jpg",1)  # legge una immagine da un file
cv2.imshow('Immagine caricata dal file...',img) # mostra l'immagine in una finestra

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # converte in scala di grigi

# soglia binaria : se è sopra passa e viene saturata al livello specificato (255), 
#        ...se il valore è inferiore viene annullato (0)
ret,soglia = cv2.threshold(gray_image,127,255,cv2.THRESH_BINARY) ########################

cv2.imshow('Immagine filtrata con soglia=127',soglia) # mostra l'immagine ottenuta in una finestra

k = cv2.waitKey(0) # attende che venga premuto un tasto
cv2.destroyAllWindows() # ...chiude tutte le finestre

Esercizio: 

Provare a variare il valore della soglia, e quello del valore di saturazione..cosa succede?


Per ulteriori approfondimenti rimando alla documentazione ufficiale

domenica 3 maggio 2015

Esercizio 2 - conversione di una immagine in scala di grigi

In questo esercizio viene caricata un'immagine e convertita in scala di grigi usando la funzione: cv2.cvtColor(...).

Si vuole che venga visualizzata sia la finestra originale che quella dell'immagine modificata.

Lo scopo dell'esercizio e' capire come funziona la visualizzazione multipla delle immagini nelle finestre e la funzione per la conversione.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("test.jpg",1)  # legge una immagine da un file
cv2.imshow('Immagine caricata dal file.',img) # mostra l'immagine in una finestra

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # converte l'immagine caricata in una in scala di grigi...

k = cv2.waitKey(0) # attende che venga premuto un tasto
cv2.destroyAllWindows() # ...chiude tutte le finestre

Esercizio:

Visualizzare l'immagine convertita in una finestra.

Esercizio 1 - Caricamento e visualizzazione immagini

Il primo esercizio consiste nel capire un semplice programma in python che si occupa dell'apertura di una immagine da file e della visualizzazione a schermo.
Una volta compreso il funzionamento occorre modificarlo per caricare e visualizzare una seconda immagine...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("test.jpg",1)  # legge una immagine da un file
cv2.imshow('Immagine caricata dal file...',img) # mostra l'immagine in una finestra

k = cv2.waitKey(0) # attende che venga premuto un tasto
cv2.destroyAllWindows() # ...chiude tutte le finestre

Questo esercizio dovrebbe essere abbastanza semplice, occorre però ricordarsi di eseguirlo all'interno della cartella dove sono presenti le immagini.


Esercizio:

Caricare e visualizzare una seconda immagine: "test2.jpg".

Benvenuti

Questo blog è stato creato per supportare il corso di introduzione alla visione artificiale che gli studenti di alcuni istituti delle scuole superiori della Valle d'Aosta stanno seguendo a Verrès.

I contenuti dei post che seguiranno non hanno lo scopo di essere esaustivi, ma la loro funzione è puramente di sostegno alle lezioni svolte in aula.


Buon lavoro a tutti!