We zijn begonnen met het leren van de basisprincipes van OpenCV en vervolgens hebben we wat basisbeeldverwerking en -manipulaties op afbeeldingen uitgevoerd, gevolgd door beeldsegmentaties en vele andere bewerkingen met behulp van OpenCV en Python-taal. Hier, in deze sectie, zullen we enkele eenvoudige objectdetectietechnieken uitvoeren met behulp van sjabloonvergelijking. We zoeken een object in een afbeelding en beschrijven de kenmerken ervan. Kenmerken zijn de algemene kenmerken van de afbeelding, zoals hoeken, randen enz. We zullen ook enkele veelgebruikte en populaire algoritmen voor objectdetectie bekijken, zoals SIFT, SURF, FAST, BREIF & ORB.
Zoals verteld in de vorige tutorials, is OpenCV Open Source Commuter Vision Library met C ++, Python en Java-interfaces en ondersteunt Windows, Linux, Mac OS, iOS en Android. Het kan dus eenvoudig worden geïnstalleerd in Raspberry Pi met Python- en Linux-omgeving. En Raspberry Pi met OpenCV en aangesloten camera kan worden gebruikt om veel realtime beeldverwerkingstoepassingen te maken, zoals gezichtsdetectie, gezichtsvergrendeling, objecttracering, auto nummerplaat detectie, huisbeveiligingssysteem etc.
Objectdetectie en -herkenning vormen de belangrijkste use case voor computervisie, ze worden gebruikt om krachtige dingen te doen, zoals
- Scènes labelen
- Robot navigatie
- Zelfrijdende auto's
- Lichaamsherkenning (Microsoft Kinect)
- Ziekte en kankerdetectie
- Gezichtsherkenning
- Handschrift herkenning
- Identificatie van objecten in satellietbeelden
Objectdetectie versus herkenning
Objectherkenning is het tweede niveau van objectdetectie waarbij de computer een object van meerdere objecten in een afbeelding kan herkennen en mogelijk kan identificeren.
Nu zullen we enkele beeldverwerkingsfuncties uitvoeren om een object in een afbeelding te vinden.
Een object zoeken op basis van een afbeelding
Hier zullen we template matching gebruiken om karakter / object in een afbeelding te vinden, gebruik OpenCV 's cv2.matchTemplate () functie om dat object te vinden
import cv2 import numpy als np
Laad de invoerafbeelding en converteer deze naar grijs
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('mensen', afbeelding) cv2.waitKey (0) grey = cv2.cvtColor (afbeelding, cv2.COLOR_BGR2GRAY)
Laad de sjabloonafbeelding
template = cv2.imread ('waldo.jpg', 0) #resultaat van sjabloonvergelijking van object over een afbeeldingsresultaat = cv2.matchTemplate (grijs, sjabloon, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (resultaat)
Maak een selectiekader
top_left = max_loc #vergroting van de begrenzende rechthoek met 50 pixels bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (image, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('object gevonden', afbeelding) cv2.waitKey (0) cv2.destroyAllWindows ()
Voer in cv2.matchTemplate (grey, template, cv2.TM_CCOEFF) de grijsschaalafbeelding in om het object en de sjabloon te vinden. Pas vervolgens de sjabloonovereenkomst toe om de objecten uit de afbeelding te vinden, hier wordt cv2.TM_CCOEFF gebruikt.
De hele functie retourneert een array die wordt ingevoerd als resultaat, wat het resultaat is van de procedure voor het matchen van sjablonen.
En dan gebruiken we cv2.minMaxLoc (resultaat) , dat de coördinaten of het begrenzingskader geeft waar het object in een afbeelding werd gevonden, en als we die coördinaten krijgen, tekenen we er een rechthoek overheen en rekken we een klein stukje van het kader uit zodat het object past gemakkelijk in de rechthoek.
Er zijn verschillende methoden om sjabloonafstemming uit te voeren en in dit geval gebruiken we cv2.TM_CCOEFF, wat staat voor correlatiecoëfficiënt.
Hier zijn de sleutelpunten (X, Y) -coördinaten die zijn geëxtraheerd met behulp van de zeefdetector en over de afbeelding zijn getekend met behulp van de cv2-tekenkeypuntfunctie.
SURFEN
import cv2 import numpy als np afbeelding = cv2.imread ('paris.jpg') grey = cv2.cvtColor (afbeelding, cv2.COLOR_BGR2GRAY)
Maak een SURF Feature Detector-object, hier stellen we de jute-drempel in op 500
surf = cv2.xfeatures2d.SURF_create (500) keypoints, descriptors = surf.detectAndCompute (grijs, Geen) print ("Aantal gevonden sleutelpunten:", len (keypoints))
Teken rijke sleutelpunten op het invoerbeeld
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Console-uitgang:
SNEL
import cv2 import numpy als np afbeelding = cv2.imread ('paris.jpg') grey = cv2.cvtColor (afbeelding, cv2.COLOR_BGR2GRAY)
Maak een FAST Detector-object
fast = cv2.FastFeatureDetector_create () # Verkrijg sleutelpunten, standaard is niet-maximale onderdrukking ingeschakeld # om uit te schakelen set fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (grijs, Geen) print ("Aantal keypunten Gedetecteerd: ", len (keypoints))
Teken rijke sleutelpunten op het invoerbeeld
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', image) cv2.waitKey () cv2.destroyAllWindows ()
Console-uitgang:
KORT
import cv2 import numpy als np afbeelding = cv2.imread ('paris.jpg') grey = cv2.cvtColor (afbeelding, cv2.COLOR_BGR2GRAY)
Maak een FAST-detectorobject
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Maak een BRIEF-extractorobject
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Bepaal de belangrijkste punten keypoints = fast.detect (grijs, Geen)
Verkrijg descriptors en nieuwe definitieve sleutelpunten met BRIEF
keypoints, descriptors = brief.compute (grijs, keypoints) print ("Aantal gevonden sleutelpunten:", len (keypoints))
Teken rijke sleutelpunten op het invoerbeeld
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', image) cv2.waitKey () cv2.destroyAllWindows ()
Console-uitgang:
ORB
import cv2 import numpy als np afbeelding = cv2.imread ('paris.jpg') grey = cv2.cvtColor (afbeelding, cv2.COLOR_BGR2GRAY)
Maak een ORB-object, we kunnen het aantal sleutelpunten specificeren dat we wensen
orb = cv2.ORB_create () # Bepaal de belangrijkste punten keypoints = orb.detect (grijs, Geen)
Verkrijg de descriptoren
keypoints, descriptors = orb.compute (grey, keypoints) print ("Number of keypoints Detected:", len (keypoints))
Teken rijke sleutelpunten op het invoerbeeld
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', image) cv2.waitKey () cv2.destroyAllWindows ()
Console-uitgang:
We kunnen het aantal keypunten specificeren met een maximale limiet van 5000, maar de standaardwaarde is 500, dwz ORB zou automatisch de beste 500 keypunten detecteren als het niet gespecificeerd werd voor een waarde van keypunten.
Dit is dus hoe objectdetectie plaatsvindt in OpenCV, dezelfde programma's kunnen ook worden uitgevoerd in OpenCV geïnstalleerde Raspberry Pi en kunnen worden gebruikt als een draagbaar apparaat zoals smartphones met Google Lens.
Dit artikel is verwezen vanuit de Master Computer Vision ™ OpenCV4 in Python met Deep Learning-cursus op Udemy, gemaakt door Rajeev Ratan, abonneer het voor meer informatie over Computer Vision en Python.