OpenCV - Variable Wertebereich von Trackbar
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
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.
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!