Abbiamo iniziato con l'apprendimento delle basi di OpenCV e poi abbiamo eseguito alcune elaborazioni e manipolazioni di immagini di base sulle immagini, seguite dalle segmentazioni delle immagini e molte altre operazioni utilizzando OpenCV e il linguaggio Python. Qui, in questa sezione, eseguiremo alcune semplici tecniche di rilevamento di oggetti utilizzando la corrispondenza dei modelli. Troveremo un oggetto in un'immagine e poi ne descriveremo le caratteristiche. Le caratteristiche sono gli attributi comuni dell'immagine come angoli, bordi ecc. Daremo anche uno sguardo ad alcuni algoritmi di rilevamento di oggetti comuni e popolari come SIFT, SURF, FAST, BREIF e ORB.
Come detto nei tutorial precedenti, OpenCV è Open Source Commuter Vision Library che 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
Il rilevamento e il riconoscimento di oggetti costituiscono il caso d'uso più importante per la visione artificiale, vengono utilizzati per fare cose potenti come
- Etichettatura di scene
- Navigazione robotica
- Auto a guida autonoma
- Riconoscimento del corpo (Microsoft Kinect)
- Rilevazione di malattie e cancro
- Riconoscimento facciale
- Riconoscimento della grafia
- Identificazione di oggetti nelle immagini satellitari
Rilevamento di oggetti VS riconoscimento
Il riconoscimento degli oggetti è il secondo livello di rilevamento degli oggetti in cui il computer è in grado di riconoscere un oggetto da più oggetti in un'immagine e può essere in grado di identificarlo.
Ora eseguiremo alcune funzioni di elaborazione delle immagini per trovare un oggetto da un'immagine.
Trovare un oggetto da un'immagine
Qui useremo la corrispondenza del modello per trovare carattere / oggetto in un'immagine, usa la funzione cv2.matchTemplate () di OpenCV per trovare quell'oggetto
importa cv2 importa numpy come np
Carica l'immagine in ingresso e convertila in grigio
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', image) cv2.waitKey (0) gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Carica l'immagine modello
template = cv2.imread ('waldo.jpg', 0) #result of template matching of object over an image result = cv2.matchTemplate (gray, template, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (risultato)
Crea riquadro di delimitazione
top_left = max_loc #increasing la dimensione del rettangolo di delimitazione di 50 pixel bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (image, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('oggetto trovato', immagine) cv2.waitKey (0) cv2.destroyAllWindows ()
In cv2.matchTemplate (gray, template, cv2.TM_CCOEFF) , inserisci l'immagine in scala di grigi per trovare l'oggetto e il modello. Quindi applica il metodo di corrispondenza del modello per trovare gli oggetti dall'immagine, qui viene utilizzato cv2.TM_CCOEFF .
L'intera funzione restituisce un array che viene immesso nel risultato, che è il risultato della procedura di corrispondenza del modello.
E poi usiamo cv2.minMaxLoc (risultato) , che fornisce le coordinate o il riquadro di delimitazione in cui l'oggetto è stato trovato in un'immagine, e quando otteniamo quelle coordinate disegniamo un rettangolo su di esso e allunghiamo un po 'le dimensioni del riquadro in modo che il l'oggetto può facilmente adattarsi all'interno del rettangolo.
Esistono vari metodi per eseguire la corrispondenza dei modelli e in questo caso stiamo usando cv2.TM_CCOEFF che sta per coefficiente di correlazione.
Qui i punti chiave sono le coordinate (X, Y) estratte usando il sift detector e disegnate sull'immagine usando la funzione cv2 draw keypoint.
SURF
importa cv2 importa numpy come immagine np = cv2.imread ('paris.jpg') gray = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)
Crea un oggetto Rilevatore di caratteristiche SURF, qui impostiamo la soglia della tela di iuta su 500
surf = cv2.xfeatures2d.SURF_create (500) keypoints, descriptors = surf.detectAndCompute (gray, None) print ("Number of keypoints Detected:", len (keypoints))
Disegna punti chiave ricchi sull'immagine di input
immagine = cv2.drawKeypoints (immagine, punti chiave, Nessuno, flag = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', immagine) cv2.waitKey () cv2.destroyAllWindows ()
Uscita console:
VELOCE
importa cv2 importa numpy come immagine np = cv2.imread ('paris.jpg') gray = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)
Crea oggetto FAST Detector
fast = cv2.FastFeatureDetector_create () # Ottieni punti chiave, per impostazione predefinita la soppressione non massima è On # per disattivare set fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (grigio, Nessuno) print ("Numero di punti chiave Rilevato: ", len (punti chiave))
Disegna punti chiave ricchi sull'immagine di input
immagine = cv2.drawKeypoints (immagine, punti chiave, Nessuno, flag = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', immagine) cv2.waitKey () cv2.destroyAllWindows ()
Uscita console:
BREVE
importa cv2 importa numpy come immagine np = cv2.imread ('paris.jpg') gray = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)
Crea oggetto rilevatore FAST
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Crea un oggetto estrattore BREVE
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Determina i punti chiave keypoints = fast.detect (grigio, Nessuno)
Ottieni descrittori e nuovi punti chiave finali utilizzando BRIEF
punti chiave, descrittori = brief.compute (grigio, punti chiave) print ("Numero di punti chiave rilevati:", len (punti chiave))
Disegna punti chiave ricchi sull'immagine di input
immagine = cv2.drawKeypoints (immagine, punti chiave, Nessuno, flag = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', immagine) cv2.waitKey () cv2.destroyAllWindows ()
Uscita console:
ORB
importa cv2 importa numpy come immagine np = cv2.imread ('paris.jpg') gray = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)
Crea un oggetto ORB, possiamo specificare il numero di punti chiave che desideriamo
orb = cv2.ORB_create () # Determina i punti chiave keypoints = orb.detect (grigio, Nessuno)
Ottieni i descrittori
punti chiave, descrittori = orb.compute (grigio, punti chiave) print ("Numero di punti chiave rilevati:", len (punti chiave))
Disegna punti chiave ricchi sull'immagine di input
immagine = cv2.drawKeypoints (immagine, punti chiave, Nessuno, flag = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', immagine) cv2.waitKey () cv2.destroyAllWindows ()
Uscita console:
Possiamo specificare il numero di punti chiave che ha un limite massimo di 5000, tuttavia il valore predefinito è 500, ovvero ORB rileverà automaticamente i migliori 500 punti chiave se non specificato per alcun valore di punti chiave.
Quindi è così che avviene il rilevamento degli oggetti in OpenCV, gli stessi programmi possono essere eseguiti anche in OpenCV installato Raspberry Pi e possono essere utilizzati come dispositivi portatili come gli smartphone con Google Lens.
Questo articolo fa riferimento al corso Master Computer Vision ™ OpenCV4 in Python con Deep Learning su Udemy, creato da Rajeev Ratan, iscriviti per saperne di più su Computer Vision e Python.