Clustering Bildsegmente in opencv

7

Ich arbeite an der Bewegungserkennung mit nicht-statischen Kamera mit opencv. Ich benutze einen ziemlich einfachen Hintergrundsubtraktions- und Schwellenwertansatz, um einen umfassenden Eindruck von allem zu bekommen, was sich in einem Beispielvideo bewegt. Nach der Schwellenwertbildung lade ich alle trennbaren "Patches" von weißen Pixeln ein, speichere sie als unabhängige Komponenten und färbe sie zufällig mit Rot, Grün oder Blau. Das Bild unten zeigt dies für ein Fußballvideo, wo alle diese Komponenten sichtbar sind.

Ich erstelle Rechtecke über diese erkannten Komponenten und erhalte dieses Bild:

So kann ich die Herausforderung hier sehen. Ich möchte alle "ähnlichen" und nahegelegenen Komponenten in einer einzigen Einheit zusammenfassen, so dass die Rechtecke im Ausgabebild einen Spieler zeigen, der sich als Ganzes bewegt (und nicht seine unabhängigen Glieder). Ich habe versucht, K-Means Clustering zu machen, aber da ich im Idealfall die Anzahl der sich bewegenden Entitäten nicht kennen würde, könnte ich keine Fortschritte machen.

Bitte zeigen Sie mir, wie ich das machen kann. Danke

    
Ekansh Gupta 24.05.2014, 08:32
quelle

4 Antworten

15

Dieses Problem kann durch den dbscan Clustering-Algorithmus nahezu perfekt gelöst werden. Im Folgenden stelle ich die Implementierung und das Ergebnisbild vor. Gray Blob bedeutet Ausreißer oder Rauschen nach dbscan. Ich habe einfach Boxen als Eingabedaten verwendet. Anfänglich wurden Kastenzentren für die Abstandsfunktion verwendet. Für Boxen reicht es jedoch nicht aus, die Entfernung korrekt zu beschreiben. Die aktuelle Distanzfunktion verwendet also den Mindestabstand aller 8 Ecken von zwei Boxen.

%Vor%

    
Zaw Lin 02.06.2014, 14:47
quelle
3

Ich stimme Sebastian Schmitz zu: Sie sollten wahrscheinlich nicht nach Clustering suchen.

Erwarten Sie nicht, dass eine uninformierte Methode wie k-means für Sie magisch wirkt. Insbesondere eine, die so grob ist wie eine Heuristik wie k-means, und die in einer idealisierten mathematischen Welt lebt, nicht in chaotischen, realen Daten.

Sie haben ein gutes Verständnis für was Sie wollen. Versuchen Sie, diese Intuition in Code zu fassen. In Ihrem Fall scheinen Sie nach verbundenen Komponenten zu suchen.

Berücksichtigen Sie das Downsampling Ihres Bilds auf eine niedrigere Auflösung und wiederholen Sie dann denselben Prozess! Oder führen Sie es sofort mit der niedrigeren Auflösung aus (um Komprimierungsartefakte zu reduzieren und die Leistung zu verbessern). Oder fügen Sie Filter hinzu, z. B. zum Weichzeichnen.

Ich würde beste und schnellste Ergebnisse erwarten, wenn ich die verbundenen Komponenten im Downsampling / gefilterten Bild betrachte.

    
Anony-Mousse 24.05.2014 11:21
quelle
1

Ich bin mir nicht ganz sicher, ob Sie wirklich nach Clustering suchen (im Sinne von Data Mining).

Clustering wird verwendet, um ähnliche Objekte gemäß einer Abstandsfunktion zu gruppieren. In Ihrem Fall würde die Entfernungsfunktion nur die räumlichen Qualitäten verwenden. Außerdem müssen Sie beim k-means-Clustering ein k angeben, das Sie wahrscheinlich vorher nicht kennen.

Es scheint mir, dass Sie nur alle Rechtecke zusammenführen wollen, deren Ränder näher beieinander liegen als ein vorbestimmter Schwellenwert. Versuchen Sie als erstes, alle Rechtecke zusammenzufassen, die sich berühren oder die näher beieinander liegen als die halbe Spielerhöhe.

Wahrscheinlich möchten Sie eine Größenprüfung einbeziehen, um das Risiko zu minimieren, dass zwei Spieler zu einem zusammengeführt werden.

Bearbeiten: Wenn Sie wirklich einen Cluster-Algorithmus verwenden möchten, verwenden Sie einen, der die Anzahl der Cluster für Sie schätzt.

    
Sebastian Schmitz 24.05.2014 08:54
quelle
0

Ich schätze, Sie können Ihren ursprünglichen Versuch verbessern, indem Sie morphologische Transformationen verwenden. Werfen Sie einen Blick auf Ссылка . Wahrscheinlich kannst du danach für jede Entität mit einem geschlossenen Satz umgehen, besonders mit separaten Spielern, so wie du dein Originalbild bekommen hast.

    
Adrian 04.11.2015 14:05
quelle