Einführung in die Objektverfolgung mit OpenCV

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

Einführung

OpenCV ist ein großartiges Tool, um mit Bildern und Videos zu spielen. Oder Sie möchten Ihren Fotos einen Schwarz-Weiß-Look aus dem 90 oder komplexe mathematische Operationen durchführen, OpenCV ist immer einsatzbereit. Wenn Sie Computer Vision mögen, Kenntnisse von OpenCV sind unerlässlich. Die Bibliothek umfasst mehr als 2500 optimierte Algorithmen, mit denen eine Vielzahl von Aufgaben ausgeführt werden kann. Es wird von vielen Branchenriesen wie Google verwendet, Microsoft, IBM und wird häufig in Forschungsgruppen eingesetzt. Die Bibliothek unterstützt mehrere Sprachen, einschließlich Java, C ++ und Python.

Dieser Artikel zeigt Ihnen, wie Sie die komplexe Aufgabe der Objektverfolgung mit einigen der Grundfunktionen von OpenCV . lösen.

Sie können ein Beispiel für ein Fußballspiel betrachten. Sie haben eine Live-Übertragung des Spiels und Ihre Aufgabe ist es, die Position des Balls jederzeit zu verfolgen. Die Aufgabe erscheint einem durchschnittlichen Menschen einfach, aber es ist selbst für die intelligenteste Maschine zu komplex. Woher willst du wissen?, Computer verstehen nur Zahlen. Du verstehst nicht was ein Bild ist, aber die mit dem Bild verbundenen Pixelwerte. Zwei Bilder, die für das menschliche Auge genau gleich erscheinen, sind für Ihren Computer möglicherweise nicht derselbe Fall, da schon eine kleine Änderung in einem Pixel zu einem Unterschied führt. Deswegen, Objektverfolgung gilt als eine der komplexesten Aufgaben in der Computer Vision. Obwohl komplex, es ist nicht etwas Unerreichbares.

Die Objektverfolgung kann sowohl mit maschinellem Lernen als auch mit Deep-Learning-basierten Ansätzen erfolgen. Der Deep-Learning-Ansatz liefert einerseits bessere Ergebnisse bei komplexen Aufgaben und ist recht weit verbreitet, erfordert viele Trainingsdaten. Während ML-basierte Ansätze relativ einfach, aber nicht weit verbreitet sind. Für diesen Artikel, Wir verwenden einen ML-basierten Ansatz in Verbindung mit verschiedenen Computer-Vision-Techniken, die wir später in diesem Artikel besprechen werden.

Die Technik wird häufig in der Überwachung eingesetzt, Sicherheit, Verkehrsüberwachung, Roboter-Vision, Videokommunikation und vieles mehr. Was ist mehr, Objektverfolgung hat mehrere Anwendungsfälle, als Menschenmenge, autonome Fahrzeuge, Gesichtserkennung, etc. Können Sie sich weitere Beispiele vorstellen, bei denen Sie Objektverfolgung in Ihrem täglichen Leben einsetzen können??

Aufgrund so vieler realer Anwendungen, Auf diesem Gebiet wird ständig geforscht, um eine höhere Präzision zu erreichen und das Modell robuster zu machen.

Für diesen Artikel, wir werden das benutzen Video. Wie du sehen wirst, Es gibt eine rote Kugel, die sich durch ein Labyrinth bewegt und unsere Aufgabe ist es, die Position der Kugel zu erkennen und ihren Schwerpunkt zu finden. Ich könnte auch ein großes Geräusch sehen (Entschuldigung Leute), Hintergrund, um die Hausaufgaben etwas schwieriger zu machen.

22521Screenshot2025-6154785

1.

Zuerst, wir importieren die zu verwendenden Bibliotheken.

numpy als np importieren
CV2 importieren

2.

Wir werden eine Funktion definieren, die die Größe der Bilder so ändert, dass sie auf unseren Bildschirm passen, falls sie groß genug sind. Dieser Schritt ist komplett optional und Sie können ihn überspringen.

def Größe ändern(img):
        cv2.resize zurückgeben(img,(512,512)) # arg1- Eingabebild, arg- Ausgabe_Breite, output_height

3.

Woher willst du wissen?, Die Videos bestehen aus Frames. Frames sind nur eines von vielen Standbildern, die zusammen das gesamte bewegte Bild ergeben. Der nächste Schritt besteht darin, diese Frames mit der VideoCapture-Funktion zu lesen () in OpenCV und mit der while-Schleife, Wir können die Bilder in Bewegung sehen. Sie können die Videogeschwindigkeit mit cv2.waitKey . anpassen (x) was den Bildschirm für x Millisekunden anhält.

cap=cv2.VideoCapture(vid_file_path)
rechts,frame=cap.read()

while ret==Wahr:
    rechts,frame=cap.read()
    cv2.imshow("Rahmen",Größe ändern(Rahmen))
    key=cv2.waitKey(1)
    if key==ord('Q'):
        brechen
cv2.waitKey(0)
cv2.destroyAllWindows()

4.

OpenCV liest Bilder im BGR-Format, also werden wir den Farbraum von BGR in HSV umwandeln. Warum HSV und nicht BGR oder ein anderes Format?

Wir verwenden das HSV-Farbformat, da es empfindlicher auf geringfügige Änderungen der externen Beleuchtung reagiert. Deswegen, gibt genauere Masken und, Daher, Beste Ergebnisse.

Nach der Konvertierung des Farbraums, Was wir tun müssen, ist den roten Kanal zu filtern und einen Maskenrahmen zu erstellen.

Der rote Kanal im HSV-Format ist vorhanden in [0,230,170] zu [255,255,220] Distanz.

cap=cv2.VideoCapture(vid_file_path)


rechts,frame=cap.read()
l_b=np.array([0,230,170])# untere hsv-Grenze für rot
u_b=np.array([255,255,220])# oberer hsv an rot gebunden

while ret==Wahr:
    rechts,frame=cap.read()

    hsv=cv2.cvtColor(Rahmen,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,Pfund,u_b)

    cv2.imshow("Rahmen",Größe ändern(Rahmen))

    cv2.imshow("Maske",Maske)


    key=cv2.waitKey(1)
    if key==ord('Q'):
        brechen
cv2.waitKey(0)
cv2.destroyAllWindows()

68572maskiert-4189669

(Dieses Bild wurde verkleinert)

5.

Bis jetzt, wir haben das maskierte Bild des Rahmens erstellt und das meiste Rauschen herausgefiltert. Was folgt, ist die Grenzen des Balls zu bekommen. Dazu verwenden wir das Konzept der Konturerkennung. Die Konturen sind nichts anderes als Grenzen, die unseren Ball umgeben werden. Glücklicherweise, Wir müssen diese Grenzen nicht alleine finden, da OpenCV eine findContours-Funktion erlaubt () die wir für unseren Zweck verwenden können. Nimmt ein maskiertes Bild auf und gibt ein Array von Konturen zurück. Weitere Informationen zu Konturen, Besuch mich. Im Idealfall, in unserem Fall, der Wert der Konturen sollte eins sein, da wir nur einen ball haben, aber weil manche Leute rote Hüte trugen, wir werden mehr als einen bekommen. Können Sie sich etwas vorstellen, um dieses Geräusch weiter zu reduzieren??

Um dieses Problem zu lösen, verwenden wir eine andere OpenCV-Funktion, nämlich cv2.contourArea (). Wir wissen im maskierten Bild, der Ball hat die größte Fläche und auch seine Umrisse. Deswegen, wir erhalten die Kontur mit der größten Fläche.

Wir haben die Konturen der Kugel und können diese Konturen direkt mit der Funktion cv2.drawContours zeichnen (). Aber für Erkennungsaufgaben, Im Allgemeinen verwenden wir ein gut abgegrenztes Rechteck, um zu zeigen, dass das Objekt erkannt wurde. Es zu tun, wir verwenden die cv2.boundingRect-Funktion (). Diese Funktion gibt die Koordinaten des Rechtecks ​​zurück und dann die Funktion cv2.rectangle () wird das Rechteck für uns zeichnen.

cap=cv2.VideoCapture(vid_file_path)


rechts,frame=cap.read()
l_b=np.array([0,230,170])# untere hsv-Grenze für rot
u_b=np.array([255,255,220])# oberer hsv an rot gebunden

while ret==Wahr:
    rechts,frame=cap.read()

    hsv=cv2.cvtColor(Rahmen,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,Pfund,u_b)

    Konturen,_= cv2.findContours(Maske,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = Konturen[0]
         für Kontur in Konturen:
                wenn cv2.contourArea(Kontur)>cv2.contourArea(max_contour):

                      max_contour=Kontur

         Kontur=max_contour
         approx=cv2.approxPolyDP(Kontur, 0.01*cv2.arcLength(Kontur,Wahr),Wahr)
         x,Ja,w,h=cv2.boundingRect(ca)
         cv2.rechteck(Rahmen,(x,Ja),(x+w,j+h),(0,255,0),4)

    cv2.imshow("Rahmen",Größe ändern(Rahmen))

    cv2.imshow("Maske",Maske)

528745-3351114

(Dieses Bild wurde verkleinert)

6.

Was ist mehr, Was wir tun können, ist gleichzeitig den Schwerpunkt der Kugel zu erkennen. Dafür, wir werden cv2.moments verwenden. cv2.moments berechnet die gewichtete Durchschnittssumme der Pixelintensitäten innerhalb der Kontur und, Daher, ermöglicht es Ihnen, nützlichere Informationen aus dem Blob zu erhalten, wie dein radio, Schwerpunkt, etc. Stellen Sie sicher, dass Sie das Bild in das Binärformat konvertieren, bevor Sie die Funktion verwenden. Sie können mehr über Momente erfahren hier.

cap=cv2.VideoCapture(vid_file_path)


rechts,frame=cap.read()
l_b=np.array([0,230,170])# untere hsv-Grenze für rot
u_b=np.array([255,255,220])# oberer hsv an rot gebunden

while ret==Wahr:
    rechts,frame=cap.read()

    hsv=cv2.cvtColor(Rahmen,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,Pfund,u_b)

    Konturen,_= cv2.findContours(Maske,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = Konturen[0]
         für Kontur in Konturen:


                wenn cv2.contourArea(Kontur)>cv2.contourArea(max_contour):

                  max_contour = Kontur

         approx=cv2.approxPolyDP(Kontur, 0.01*cv2.arcLength(Kontur,Wahr),Wahr)
         x,Ja,w,h=cv2.boundingRect(ca)
         cv2.rechteck(Rahmen,(x,Ja),(x+w,j+h),(0,255,0),4)

         M=cv2.momente(Kontur)

cx = int (m['M10']//METRO[‘m00’])
cy = int (m[„M01“]//METRO[‘m00’])
cv2.circle (Marco, (cx, cy), 3, (255,0,0), – 1)


    cv2.imshow("Rahmen",Größe ändern(Rahmen))

    cv2.imshow("Maske",Maske)

    key=cv2.waitKey(1)
    if key==ord('Q'):
        brechen
cv2.waitKey(0)
cv2.destroyAllWindows()

200486-8346694

(Dieses Bild wurde verkleinert)

Wohin von hier aus

In diesem Artikel, Wir haben die Objekterkennung in jedem Frame für die Objektverfolgungsaufgabe verwendet. Obwohl es nützlich ist, es kann nicht in allen Fällen gut funktionieren. Beim Lesen des Artikels, Einige Fragen haben Ihr Gehirn vielleicht getroffen. Was ist, wenn das Video mehr als ein Objekt enthält?? Was ist, wenn die Maskenbilder nicht helfen, das Objekt zu erkennen?? Was ist, wenn sich das Objekt ständig in den Rahmen hinein und aus ihm heraus bewegt?? Was ist, wenn kein Objekt vorhanden ist??

Die einzige Möglichkeit, sie zu finden, besteht darin, sie selbst auszuprobieren.. Sie können die Einträge jederzeit ändern und die Aufgabe etwas anspruchsvoller gestalten, bis der Spaß aufhört.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.