Frage

Ich habe einen Satz von Bildern und möchte ein Kreuzabgleich zwischen allen anpassen und die Ergebnisse mit Trackbars mit dem OpenCv 2.4.6 (ROS Hydro-Paket) verwenden. Der passende Teil erfolgt mit einem Vektor von Vektoren von Vektoren von CV :: DMatch-Objekten:

generasacodicetagpre.

Weil wir ein Bild mit sich selbst übereinstimmen (keiner Punkte dabei), und da ein Abfragebild nicht mit dem gesamten Set von übereinstimmenden Train-Bildern für ein Abfragebild angepasst werden kann, haben möglicherweise eine andere Größe aus dem Rest. Beachten Sie, dass die Art und Weise, wie sie implementiert ist ) Aber das ist es jetzt. Um die Zeichnung von aufeinander abgestimmten Blättern von Bildern zu vermeiden, habe ich einen Vektor von Vektoren von CV :: MAT-Objekten bevölkert. Jeder CV :: MAT steht für das aktuelle Abfragebild und ein übereinstimmendes Train-Image (ich füllt es mit CV :: Cutmatches ()):

generasacodicetagpre.

note : im Beispiel oben CV :: MAT [0,3] steht für CV :: MAT, die das Produkt von CV :: Drawmatches () mit dem Bild [0] und das Bild speichert [ 3].

Hier sind die GUI-Einstellungen:

  • Hauptfenster: Hier zeigt ich das aktuelle Abfragebild an. Verwenden einer Trackbar - Nennen Sie es den TRACK_QUERY - ich überlege jedes Bild in meinem Set.
  • sekundäres Fenster: Hier zeige ich das abgestimmte Paar (Abfrage, Zug) an, wobei die Kombination zwischen der Position von Track_Query-Schieberegler und der Position des Schiebereglers einer anderen Trackbar in diesem Fenster - nennen wir ihn track_train - lässt mich durchlaufen Alle CV :: MAT-Match-Bilder für das aktuelle Abfragebild.

Das Problem kommt hier aus der Tatsache, dass jede Abfrage eine variable Anzahl von angepassten Zugbildern aufweisen kann. Mein Track_Train sollte in der Lage sein, sich an die Anzahl der angepassten Zugbilder anzupassen, dh der Anzahl der Elemente in jedem CV :: MAT-Vector für das aktuelle Abfragebild. Leider konnte ich bislang keinen Weg finden, um das zu tun. Der CV :: CreateTrackBar () erfordert einen Count-Parameter, der aus dem, was ich sehe, das Limit des Sliders des Trackbars setzt, und kann nicht später geändert werden. Korrigieren Sie mich, wenn ich falsch liege, da dies genau das ist, was mich stört. Eine mögliche Lösung (weniger elegant und mit verschiedenen Überprüfungen zur Vermeidung von Error-Errtraten) besteht darin, die Größe des größten Satzes miteinander abgestimmten Train-Bildern zu ergreifen und sie als Grenzwert für meinen Track_Train zu verwenden. Ich möchte, dass dies möglich ist, wenn möglich. Eine andere mögliche Lösung beinhaltet das Erstellen einer Trackbar pro Abfragebild mit dem entsprechenden Wertebereich und tauschen Sie jeweils in meinen sekundären Fenstern gemäß dem ausgewählten Abfragebild. Im Moment scheint dies der einfache Weg zu sein, sondern stellt jedoch einen großen Aufwand von Trackbars dar, um diese Tatsache nicht zu erwähnen, dass ich von OpenCV nicht gehört habe, dass Sie GUI-Steuerelemente ausblenden können. Hier sind zwei Beispiel, die Dinge ein bisschen mehr klären können:

Beispiel 1: Im Hauptfenster wähle ich Bild 2 mit Track_Query. Für dieses Bild habe ich es geschafft, 5 weitere Bilder von meinem Set mitzuteilen. Nehmen wir an, das sind Bild 4, 10, 17, 18 und 20. Das sekundäre Fenster aktualisiert automatisch und zeigt mir das Match zwischen Bild 2 und Bild 4 (zuerst in der Untermenge von übereinstimmenden Zugbildern). Track_Train muss von 0 bis 4 gehen. Der Schieberegler in beide Richtungen kann den Bild 4, 10, 17, 18 und 20 jedes Mal durch das sekundäre Fenster durchlaufen.

Beispiel 2: Im Hauptfenster wähle ich Bild 7 mit Track_Query. Für dieses Bild habe ich es geschafft, 3 weitere Bilder von meinem Set mitzuteilen. Nehmen wir an, das sind Bild 0, 1, 11 und 19. Das sekundäre Fenster aktualisiert automatisch und zeigt mir das Match zwischen Bild 2 und Bild 0 (zuerst in der Untermenge von übereinstimmenden Zugbildern). Track_train muss von 0 bis 2. gehen, um den Schieberegler in beide Richtungen zu bewegen, können Sie das Bild 0, 1, 1 und 19 jedes Mal, wenn das sekundäre Fenster aktualisiert wird.

Wenn Sie Fragen haben, fühlen Sie sich frei, um sie zu fragen, und ich werde sie so gut beantworten, wie ich kann. Vielen Dank im Voraus!

ps: Leider ist die Art und Weise, wie das ROS-Paket ist, das nackte Minimum an dem, was OpenCV anbieten kann. Keine QT-Integration, kein OpenMP, kein OpenGL etc.

War es hilfreich?

Lösung

Nachdem ich noch mehr Forschungen getan habe, bin ich ziemlich sicher, dass dies derzeit nicht möglich ist. Deshalb habe ich den ersten Satz implementiert, den ich in meiner Frage gegeben habe - Verwenden Sie den Match-Vector mit den meisten Punkten, um eine maximale Größe für die Trackbar zu ermitteln, und verwenden Sie dann einige Überprüfungen, um außerhalb der Reichweite zu vermeiden. Darunter gibt es eine mehr oder weniger detaillierte Beschreibung, wie alles funktioniert. Da das übereinstimmende Verfahren in meinem Code einige zusätzliche Kontrollen beinhaltet, die das Problem nicht betreffen, werde ich es hier überspringen. Beachten Sie, dass in einem bestimmten Satz von Bildern zusammenpassen, ich beziehe mich auf ein Bild als Object-Image, wenn das Bild (Beispiel: Karte) derzeit an ein Szenenbild abgestimmt ist (Beispiel: ein Kartensatz) - Top-Level der Matches-Vektor (siehe unten) und gleich dem Index in den Verarbeitungsimagen (siehe unten). Ich finde die Zug- / Abfrage-Notation in OpenCV etwas verwirrend. Diese Szene / Objekt-Notation erfolgt von http://docs.opencv.org /doc/tutorials/features2d/feature_homography/feature_homography.html . Sie können die Notation auf Ihren Wünschen ändern oder tauschen, aber Sie stellen Sie sicher, dass Sie es überall ändern, andernfalls können Sie ein paar seltsame Ergebnisse enden.

generasacodicetagpre.

Der knifflige Teil ist die Trackbar im zweiten Fenster, das für den Zugriff auf die übereinstimmenden Bilze zu unserem aktuell ausgewählten Bild im Fenster "Bilder" verantwortlich ist. Wie ich oben erläutert habe, lege ich die Trackbar "Übereinstimmungen:" in den "Übereinstimmungen für das aktuelle Bild" -fenster ein, um einen Bereich von 0 bis (scenewithmaxmatches-1) zu haben. Nicht alle Bilder haben jedoch die gleiche Menge an Übereinstimmungen mit dem Rest in dem Bildsatz (gilt, wenn Sie ein zusätzliches Filtern durchgeführt haben, um zuverlässige Übereinstimmungen zu gewährleisten, um beispielsweise die Eigenschaften des Homographie-, Verhältnisstests, Min / Max-Abstandsprüfung usw. zu gewährleisten .). Da ich keinen Weg finden konnte, um den Trackbars-Bereich dynamisch einzustellen, brauchte ich eine Validierung des Index. Ansonsten für einige der Bilder und ihren Spielen wirft der Antrag eine außerhalb der Reichweite aus. Dies ist auf die einfache Tatsache zurückzuführen, dass wir für einige Übereinstimmungen versuchen, auf einen Match-Vektor mit einem Index, der größer als die Größe ist, minus 1, da CV :: gettrackBarpos () den ganzen Weg nach (SzenewithMaxMatches - 1) geht. Wenn die Position des Trackbars für den aktuell ausgewählten Vektor mit Übereinstimmungen ausgeht, lege ich einfach das MatchDraw-Image in "Übereinstimmungen für das aktuelle Bild" bis zum letzten im Vektor. Hier nutze ich die Tatsache, dass die Indexierung nicht unter null und die Position des Trackbars nicht unternommen werden kann, sodass dies jedoch nicht überprüfen muss, sondern nur das, was nach der Ausgangsposition 0 kommt. Wenn dies nicht Ihr Fall ist, müssen Sie sicherstellen gebunden und nicht nur das obere.

hoffe das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top