clustering-Bild-Segmente in opencv
Ich arbeite bei Bewegungserkennung mit nicht-statischen Kamera mit opencv.
Ich bin mit einem ziemlich grundlegenden hintergrund-Subtraktion und thresholding-Ansatz, um einen breiten Einblick in all das bewegt sich in einem Beispiel-video. Nach der Binarisierung, die ich gewinnen Sie alle trennbaren "Flecken" von der weißen Pixel, speichern Sie Sie als unabhängige Komponenten und die Farbe, die Sie zufällig mit rot, grün oder blau. Das Bild unten zeigt dies für ein Fußball-video, wo alle diese Komponenten sind sichtbar.
Ich erstellen Sie Rechtecke, die über diese Komponenten erkannt und ich bekomme dieses Bild:
Damit ich sehen kann, ist die Herausforderung hier. Ich möchte cluster alle "ähnlich" und schließen-von Komponenten zu einer einzigen Einheit, so dass die Rechtecke in das Bild zeigen, ein Spieler bewegen sich als ganzes (und nicht seine unabhängige Glieder). Ich habe versucht zu tun, K-means clustering da aber im Idealfall möchte ich nicht wissen, die Anzahl der sich bewegenden Entitäten, konnte ich keine Fortschritte machen.
Bitte führe mich auf, wie ich dies tun kann. Dank
- Sie können in der Lage sein abzuschätzen, k-clustering durch zählen blobs in einer Downsampling-version Ihres segmentierten Bild. Mean-shift kann ein anderer Ansatz.
- Wie würde die Neuberechnung des Bildes zu kleineren Anzahl von bits helfen?
- answers.opencv.org/question/27897/...
- Downsampling hilft, da die kleinen blobs im Bild oben verbinden sich zu größeren, einzelnen blobs - so bekommen Sie etwas mehr wie ein blob pro Fußballer (oder andere bewegliche Objekt). Dann zählen Sie die blobs für eine grobe Schätzung des k-clustering, und führen Sie dann das clustering auf dem Bild in voller Größe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
kann dieses problem nahezu perfekt gelöst von dbscan clustering-Algorithmus. Unten biete ich die Umsetzung und das Ergebnis. Graue blob bedeutet, dass Ausreißer oder Lärm nach dbscan. Ich benutzte einfach Boxen, die als input-Daten. Zunächst, box-Centern wurden für Distanz-Funktion. Aber für die Boxen, es ist nicht ausreichend, um korrekt zu charakterisieren Entfernung. So, die aktuelle Distanz-Funktion verwenden der minimale Abstand von allen 8 Ecken der beiden Boxen.
Stimme ich mit Sebastian Schmitz: man sollte wohl nicht sein auf der Suche für das clustering.
Erwarte nicht, dass eine uninformiert Verfahren wie k-means arbeiten Magie für Sie. Insbesondere eine, die als grobe Heuristik, wie k-means, und dem Leben in einer idealisierten mathematischen Welt, nicht unordentlich, echte Daten.
Haben Sie ein gutes Verständnis von was Sie wollen. Versuchen Sie, diese intuition in code. In Ihrem Fall, Sie scheinen auf der Suche nach angeschlossenen Komponenten.
Betrachten Neuberechnung Ihr Bild auf eine niedrigere Auflösung, dann erneutes ausführen der gleichen Verfahren! Oder es läuft auf die geringere Auflösung sofort (um die Kompression zu verringern Artefakte, und die Leistung zu verbessern). Oder hinzufügen Filter, wie Unschärfe.
Ich würde erwarten, dass die besten und schnellsten Ergebnisse bei angeschlossenen Komponenten in das Downsampling/gefiltertes Bild.
Ich bin mir nicht ganz sicher, ob Sie wirklich auf der Suche nach clustering (in die Data-Mining-Sinn).
Clustering wird verwendet, um Gruppen ähnlicher Objekte anhand einer distanzfunktion. In Ihrem Fall ist die Distanz-Funktion verwenden Sie nur die räumlichen Qualitäten. Außerdem in der k-means-clustering müssen Sie angeben, ein k, dass Sie haben wahrscheinlich nicht vorher wissen.
Mir scheint, Sie wollen einfach nur verschmelzen alle Rechtecke, deren Grenzen liegen näher zusammen als einen vorgegebenen Schwellenwert. So als erste Idee zu versuchen, verschmelzen alle Rechtecke, die sich berühren oder näher zusammen sind als die Hälfte ein Spieler der Höhe.
Werden Sie wahrscheinlich wollen, um eine Größe zu überprüfen, um zu minimieren das Risiko der Zusammenführung von zwei Spielern in einem.
Edit: Wenn Sie wirklich wollen, zu einem clustering-Algorithmus eine Abschätzung der Anzahl der Cluster für Sie.
Ich denke, Sie können verbessern Sie Ihre ursprünglichen Versuch mit Hilfe morphologischer Transformationen. Werfen Sie einen Blick auf http://docs.opencv.org/master/d9/d61/tutorial_py_morphological_ops.html#gsc.tab=0. Wahrscheinlich können Sie sich mit einer geschlossen Reihe für jede Person nach, dass, speziell mit separaten Spieler, wie Sie bekam in Ihrem ursprünglichen Bild.