OpenCV

Liberamente ispirandomi a Wikipedia, posso dirvi che OpenCV (acronimo in lingua inglese di Open Source Computer Vision Library) è una libreria software multipiattaforma nell’ambito della visione artificiale in tempo reale.

È una libreria software libera originariamente sviluppato da Intel e poi presa in carico dalla comunità opensource. Il linguaggio di programmazione principalmente utilizzato per sviluppare con questa libreria è il C++, ma è possibile interfacciarsi ad essa anche attraverso il C, il Python e Java.

Installazione su RPI3 (Raspbian Buster)

L’installazione della libreria su Raspbian Buster è notevolmente semplificata dalla presenza di alcuni pacchetti precompilati nei repository.

L’installazione descritta di seguito è relativo alla versione 3.4.x nonostante sia già disponibile, anche su Raspbian, la versione 4.1.x. Purtroppo nei nostri test di laboratorio abbiamo avuto qualche problemino con essa…

Procedete come di seguito. Ricordate inoltre che qualsiasi operazione di installazione del sistema inizia con l’aggiornamento dello stesso…

$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt install libxvidcore-dev libx264-dev
$ sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
$ sudo apt install libhdf5-dev libhdf5-serial-dev libhdf5-103
$ sudo apt install libatlas-base-dev gfortran
$ sudo apt install libfontconfig1-dev libcairo2-dev
$ sudo apt install libgdk-pixbuf2.0-dev libpango1.0-dev
$ sudo apt install libgtk2.0-dev libgtk-3-dev
$ sudo apt install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
$ sudo apt install python3-dev

Poi, finalmente…

$ sudo pip3 install opencv-contrib-python==3.4.3.18

TEST

Al termine dell’installazione si può procedere con il primo test di funzionamento, che verifica semplicemente se l’installazione è andata a buon fine. Il test prova semplicemente a caricare il modulo cv2 all’interno dell’interprete python3.

$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>

LAB 00 - Controlliamo un pò di versioni

Prima di procedere, assicuriamoci, ancora, di avere installato correttamente le versioni di Opencv e di Python. Ancora , direte voi… beh la prudenza non è mai troppa. Probabilmente troverete già installato il programma Thonny sul vostro Raspberry. Thonny è un semplice ed «abbastanza» completo IDE (Integrated Development Environment) per sviluppare applicazioni in Python. Quindi, caricate su Thonny il testo sotto indicato ed eseguitelo… Se non dovesse funzionare potete sempre utilizzare la shell di comandi (terminale).

import cv2 as cv
import sys
print("Versione Python")
print(sys.version)
print ("versione OpenCv")
print(cv.__version__)

LAB 01 - Carichiamo un’immagine

Cominciamo a prendere un pò di confidenza con le immagini. Carichiamone una e proviamo a comprendere il codice sotto riportato.

import cv2
import numpy as np
from matplotlib import pyplot as plt
#legge un file in formato .jpg mostrato poi in due finestra
#una di questa mostra l'immagine in scala di grigi

img = cv2.imread('watch.jpg',cv2.IMREAD_GRAYSCALE)
img1 = cv2.imread('watch.jpg')
cv2.imshow('imageGray',img)
cv2.imshow('imageColor',img1)
#wait for a pressed key
cv2.waitKey(0)
cv2.destroyAllWindows()

LAB 02 - Ancora sulle immagini

Ancora sulle immagini. Questa volta invece di usare una immagine trasformata in scala di grigio, usiamo l’immagine a colori. Notate il diverso tasto di controllo per uscire dal programma e la possibilità di salvare l’immagine sotto un altro nome.

import cv2 as cv
import sys
print("Versione Python")
print(sys.version)
print ("versione OpenCv")
print(cv.__version__)

#import numpy library to do some draws
import numpy as np
# Load an color image in grayscale
img = cv.imread('cam.jpg',cv.IMREAD_COLOR)
print ("immagine caricata")
cv.imshow('image', img)
#wait for a pressed key
k=cv.waitKey(0)
if k == 27:         # wait for ESC key to exit
        cv.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
        cv.imwrite('camsalvata.png',img)
        cv.destroyAllWindows()

LAB 03 - Disegniamo qualcosa. Forme, parole, linee… liberate la vostra fantasia e create nuove immagini

import numpy as np
import cv2

img = cv2.imread('watch.jpg',cv2.IMREAD_COLOR)
cv2.line(img,(0,0),(200,300),(255,255,255),5)
cv2.rectangle(img,(15,25),(200,250),(0,0,255),5)
cv2.circle(img,(100,63), 55, (0,255,0), -1)

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
# OpenCV documentation had this code, which reshapes the array to a 1 x 2. I did not
# find this necessary, but you may:
#pts = pts.reshape((-1,1,2))
cv2.polylines(img, [pts], True, (0,255,255), 3)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Ciao Mondo!',(0,50), font, 1, (200,255,155), 2, cv2.LINE_AA)
#now show the modified image
cv2.imshow('image',img)
#wait for a pressed key
cv2.waitKey(0)
cv2.destroyAllWindows()

LAB 04 - Finalmente un pò di video

import numpy as np
import cv2
#a little of videos
#reading video files
cap = cv2.VideoCapture(0)

while(True):
        ret, frame = cap.read() #il modo più semplice per leggere un file video

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
                break

cap.release()
cv2.destroyAllWindows()

LAB 05 - Apriamo qualche finestra

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        # Our operations on the frame come here
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        #color = cv.cvtColor(frame, cv.COLOR_BRG)
        # Display the resulting frame
        cv.imshow('frame',gray)
        cv.imshow('frame1',frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
                break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

LAB 06 - Visi: riconosciamoli

import cv2
import sys

#cascPath = sys.argv[1]
#faceCascade = cv2.CascadeClassifier(cascPath)
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
video_capture = cv2.VideoCapture(0)

while True:
        # Capture frame-by-frame
        ret, frame = video_capture.read()

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = faceCascade.detectMultiScale(
                gray,
                scaleFactor=1.1,
                minNeighbors=5,
                minSize=(30, 30),
                #flags=cv2.cv.CV_HAAR_SCALE_IMAGE
        )

        # Draw a rectangle around the faces
        for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        # Display the resulting frame
        cv2.imshow('Video', frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
                break

# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

LAB 07 - Ogni viso ha i suoi occhi

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

while 1:
        ret, img = cap.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x,y,w,h) in faces:
                cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),1)
                roi_gray = gray[y:y+h, x:x+w]
                roi_color = img[y:y+h, x:x+w]

                eyes = eye_cascade.detectMultiScale(roi_gray)
                for (ex,ey,ew,eh) in eyes:
                        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)

        cv2.imshow('img',img)
        k = cv2.waitKey(30) & 0xff
        if k == 27: #esc 27 ascii
                break

cap.release()
cv2.destroyAllWindows()

LAB 08 - Alla ricerca del colore

Ponete un oggetto di colore verde davanti alla vostra webcam e vediamo cosa succede. Una pallina sarebbe l’oggetto perfetto.

import cv2
import numpy as np
import math

# creo l'oggetto per l'acquisizione del video inserendo 0 il video verra acquisito dalla telcamera,
# inserendo il nome di un file video (posto nella directory del programma) verra aperto quello.
cap = cv2.VideoCapture(0)

# Controllo che la telecamera sia disponibile
if (cap.isOpened()== False):
  print("IMPOSSIBILE ACQUISIRE IL VIDEO!")

# Eseguo finche il video e disponibile

while(cap.isOpened()):
  # leggo frame per frame
  ret, frame = cap.read()
  if ret == True:

        #converto in formato hsv
        frame1= cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        #applico una sfumatuta per ridurre i disturbi
        frame2= cv2.GaussianBlur(frame1,(5,5),0)

        #definisco i margini di colore da filtrare
        chiaro=np.array([50,80,80])
        scuro=np.array([80,200,200])

        #filtro l'immagine secondo i colori definiti
        frame3=cv2.inRange(frame2, chiaro,scuro)

        #applico una sfumatuta per ridurre i disturbi
        _,frame4= cv2.threshold(frame3,127,255,0)

        #calcolo l'area della superficie colorata e ottengo di conseguenza il centro
        moments = cv2.moments(frame4)
        area = moments['m00']

        radius =int( (math.sqrt((area/3.14)))/10)
        centroid_x, centroid_y = None, None

        if area != 0:
                c_x = int(moments['m10']/area)
                c_y = int(moments['m01']/area)
                print("x: ", c_x,"y: ",c_y)

        # se e stato trovato un oggetto corrispondente ai citeri di ricerca(colore),
        # utilizzo le sue coordinate sullo schermo per tracciare un cerchio attorno ad esso

        if c_x != None and c_y != None:

                # disegno il cerchio
                cv2.circle(frame, (c_x,c_y), radius, (0,0,255),2)

        #disegno la griglia sullo schermo
        cv2.line(frame,(320,0),(320,480),[255,0,0],1)
        cv2.line(frame,(0,240),(640,240),[255,0,0],1)
        cv2.rectangle(frame,(310,230),(330,250),[0,0,255],1)


        # proietto il video acquisito in una finestra
        cv2.imshow('Frame',frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
                break

  # esco dal loop
  else:
        break

# chiudo il file video o lo stream della telecamera
cap.release()

# Chiudo la finestra creata
cv2.destroyAllWindows()