Bilder vergleichen SIFT / SURF Details in .yml Dateien OpenCV?

8

Ich bin Java-Android-Entwickler, ich weiß nicht viel über C / C ++ oder Matlab-Funktionen. Was einfach in meinem Code getan wird, ist einfach Sift / Surf Bilder Details zu erstellen und Details in .yml-Dateien zu speichern.

Hier ist Code, wie ich sift erstellen

%Vor%

Speichern des Ergebnisdeskriptors in der (.yml) -Datei und späteres Vergleichen dieser XML-Dateien mit dem FlannBasedMatcher von OpenCV

hier ist mein Code

Deskriptoren1 & amp; descriptors2 ist ein mat-Objekt, das aus .yml-Dateien erstellt wird.

%Vor%

Das Problem ist in obigem Code, ich bekomme jedes Mal ein anderes Ergebnis.e

hier meine zwei Bilder als

%Vor%

Ich gehe davon aus, dass das Bild aufgrund des positiven und negativen Ergebnisses dünner oder unähnlich ist. Aber mit dieser Art von unterschiedlichem Ergebnis jedes Mal kann ich Bild nicht ähnlich sagen oder nicht.

Bitte helft mir, ich weiß nichts über Opencv und c. Wenn jemand eine Idee hat, dann bitte korrigierten Code vorschlagen. Danke.

    
khurram 23.04.2015, 17:18
quelle

2 Antworten

4

Grundsätzlich kann SIFT / SURF nicht erkennen, ob zwei Bilder ähnlich sind oder nicht. Er kann Ihnen nur sagen, welcher Schlüsselpunkt in einem Bild mit welchem ​​entsprechenden Punkt in dem anderen Bild übereinstimmt.

Glücklicherweise bietet Ihnen die Funktion zwei auch weitere Informationen, z. B. die Entfernung einer Übereinstimmung und die Gesamtzahl der Übereinstimmungen im Bild.

Meine Idee zu sagen, wie ähnlich die beiden Bilder sind:

%Vor%

Hier ist das Stück Code, das ich einmal benutzt habe, immer noch ein paar Fehler. (Für eine bestimmte Art von Matches ist die Punktzahl unangemessen. Aber diese Situation tritt selten auf).

Beachten Sie, dass die MY_****_DISTANCE davon abhängen, ob Sie SIFT oder SURF verwenden, und die Parameter der SIFT / SURF-Funktionen, die Sie angeben.

%Vor%

Aktualisieren

Mein _ **** _ Abstand

My_****_DISTANCE ist etwas, das ich selbst definiert habe, tut mir leid, dass ich das vorher nicht erklärt habe. Dies ist der Wert, den ich verwende, aber möglicherweise möchten Sie ihn ändern, damit er besser in Ihren Code passt.

%Vor%

Wenn SIFT mit den Parametern SiftFeatureDetector detector(400, 3, 0.04, 10.0, 1.6); ausgeführt wird, ist das Ergebnis einer 'falschen' Übereinstimmung im Vergleich zu einer 'richtigen' Übereinstimmung:

%Vor%

Es ist offensichtlich, dass der Durchschnitt der "falschen" Übereinstimmung größer ist als der Durchschnitt der "richtigen" Übereinstimmung. Aber wenn du viele Bilder durchläufst, wirst du zu einigen Ausnahmen kommen (wie zum Beispiel falsche Treffer mit weniger Übereinstimmungen aber geringerer durchschnittlicher Distanz), von denen ich einige nicht herausgefunden habe, wie man sie eliminiert. Daher müssen Sie, basierend auf den Rohdaten der übereinstimmenden Entfernung, auch eine ziemlich "persönliche" Bewertung abgeben.

findHomographie

Hier ist eine Demo, die Sie vielleicht brauchen.

%Vor%

Und Sie finden detaillierte Informationen in diesem Tutorial

Update # 2

Check_Valid_Homographie

Das hängt davon ab, wie Sie "gültig" definieren. Schauen Sie sich das offizielle Beispiel an, das Bild links (das Bild "Objekt") ist Teil des Bildes rechts (das Bild "Szene"). Wenden Sie dann die Homographiematrix auf die Eckenvektoren des "Objekt" -Bildes an, wir erhalten schließlich rechts ein grünes Viereck, das markiert, wo das "Objekt" -Bild lokalisiert wird.

Was mich betrifft, ist meine Definition von "gültig" basierend auf dem Tutorial:     1. Die vier Punkte bilden ein Viereck     2. Keiner der Länge der Seite des Vierecks sollte zu klein sein     3. Keiner der Winkel im Viereck sollte zu klein sein.     4. Das Viereck sollte nicht auf dem Kopf stehen.

Und einige grundlegende mathematische Arbeiten sind hier ein Teil des Verifizierungsprozesses.

%Vor%

Auch hier möchten Sie vielleicht Ihren eigenen Verifizierungsprozess erstellen. Wie bei der Validierung hängt dies stark von Ihren Anforderungen ab. Aber in meinem Punkt ist dieser Teil der einfachste, während der wichtigste Teil der Scoring-Prozess ist.

    
pwwpche 24.04.2015 02:29
quelle
-1
  

Das Problem ist in obigem Code ist ich bekomme jedes Ergebnis anders   Zeit

Dies liegt daran, dass der FLANN-Matcher ungefähre nächste Nachbarn findet und auf der Initialisierung mit Zufallszahlen basiert. Um die gleiche Antwort in jedem Lauf zu garantieren, sättigen Sie entweder den Zufallszahlengenerator (z. B. Aufruf srand(123456); ) oder verwenden Sie BruteForceMatcher , das langsamer ist, aber immer das genaueste Ergebnis erhält.

    
cdmh 30.04.2015 13:26
quelle

Tags und Links