OpenCV
Python Code Snippets

In questo post, che aggiornerò con il tempo, riporterò snippets di codice con le funzioni più utili di OpenCV Python.   Poiché, non utilizzando per certi periodi alcune di queste funzioni la mia memoria decide di formattare tutto, ho deciso di mantenere traccia di questi importanti strumenti in questa pagina. Per chi non lo sapesse, OpenCV è una formidabile e potente libreria di computer vision scritta in C++ che dal 2015 supporta Python 3+! Se non si vuole installare la versione completa, le funzioni base sono raccolte nel pacchetto “opencv-python” che può essere comodamente installato attraverso “pip”.

Basic Operations with Images

Loading, Displaying and Saving

import cv2

# import an image from disk
img = cv2.imread("path/of/image.png")

# show an image
cv2.imshow("Name of the Window", img)
# pause until a key is pressed
cv2.waitKey(0)

# save an image
cv2.imwrite("new/path/image.png", img)

La funzione “waitKey()” serve a sospendere l’esecuzione del codice. La variabile che passiamo indica il tempo di attesa; se zero il programma attenderà un segnale per un tempo infinito.

> Manipulate Pixels

# get (0,0) pixel value and assign to a tupple
(b, g, r) = img[0, 0]

# assign at (0,0) a new value
img[0, 0] = (0, 0, 255)

# crop a portion of an image
crop = img[0:100, 0:100]

# assign a new value to an entire portion
img[0:100, 0:100] = (0, 255, 0)

Un immagine è un numpy array con una “shape”, (altezza, larghezza, profondità), dove profondità, per un immagine a colori, è sempre tre.  Quindi può essere facilmente manipolata come una matrice tridimensionale. È da tenere bene a mente che OpenCV per motivi storici ordina i canali come B G R e NON R G B. Inoltre, quando usiamo le funzioni di OpenCV il sistema di riferimento segue quello classico delle immagini (larghezza, altezza) e quindi ha gli assi invertiti.

opencv_coordinate_frame
Sistema di riferimento utilizzato da OpenCV

> Drawing Geometric Shapes

# create a black canvas where to draw
blue_color = (255, 0, 0)
canvas = np.zeros((300, 300, 3), dtype = "uint8")

# ----LINE
# attributes: where_to_draw, starting_point, end_point, color, thickness
cv2.line(canvas, (250, 0), (0, 250), blue_color, 2)

# ----RECTANGLE
# attributes: where_to_draw, starting_point, end_point, color, thickness (if -1 full)
cv2.rectangle(canvas, (200, 0), (300, 300), blue_color, -1)

# ----CIRCLE
# attributes: where_to_draw, center (x,y), radius, color, thickness (if -1 full)
cv2.circle(canvas, (200,200), 10, blue_color, 3)

# ----POLYGON
# create an array (int32) with vertices and reshape (rows, 1, 2)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
# attributes: where_to_draw, points, close_or_not, color
cv2.polylines(canvas, [pts], True, blue_color)

# ----TEXT
# attributes: where_to_draw, what_to_write, starting_point (x,y), font, font_scale, color, thickness, line_type
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(canvas, 'OpenCV', (100, 100), font, 4, blue_color, 2, cv2.LINE_AA)

Tutte le coordinate seguono il sistema di riferimento di OpenCV.