Ich arbeite derzeit mit und vergleiche die Leistung mehrerer von OpenCV bereitgestellter Feature-Detektoren als Grundlage für den visuellen Feature-Matching.
Ich verwende SIFT- Deskriptoren. Ich habe beim Erkennen von MSER- und DoG-Funktionen (SIFT) eine zufriedenstellende Übereinstimmung erzielt (nachdem ich schlechte Übereinstimmungen abgelehnt habe ) .
Derzeit teste ich meinen Code mit GFTT (Good Features to Track - Harris-Ecken) , um einen Vergleich zu erhalten, und auch, weil in der endgültigen Anwendung eine Reihe von GFTT-Funktionen aus dem visuellen Feature-Tracking-Prozess verfügbar sein werden.
Ich verwende, cv::FeatureDetector::detect(...)
wodurch ich mit erkannten Merkmalen / Schlüsselpunkten / Regionen von Interessestd::vector<cv::KeyPoint>
gefüllt werde . Die Struktur enthält grundlegende Informationen zum Standort des Features sowie Informationen zu und in denen der Schlüsselpunkt erkannt wurde.cv::KeyPoint
size
octave
Meine ersten Ergebnisse mit GFTT waren schrecklich, bis ich die typischen size
und octave
Parameter in verschiedenen Arten von Merkmalen verglichen habe :
- MSER stellt die Größe ein (zwischen 10 und 40 Pixel) und belässt die Oktave auf 0
- DoG (SIFT) legt sowohl die Größe als auch die Oktave fest ( Verhältnis Größe / Oktave zwischen 20 und 40).
- GFTT Die Parameter sind immer : Größe = 3 , Oktave = 0
Ich nehme an , das liegt daran, dass der Hauptzweck von GFTT- Funktionen nicht darin bestand, beim Abgleich, sondern nur beim Tracking verwendet zu werden. Dies erklärt die geringe Qualität der Übereinstimmungsergebnisse, da die aus solch winzigen Merkmalen extrahierten Deskriptoren für viele Dinge , einschließlich kleiner 1-Pixel-Verschiebungen, nicht mehr diskriminierend und unveränderlich sind .
Wenn ich manuell das Set size
von GFTT auf 10 bis 12 , ich gute Ergebnisse erzielen, sehr ähnlich wie bei der Verwendung von MSER oder Hund (SIFT) .
Meine Frage ist: Gibt es einen besseren Weg, um festzustellen, um wie viel die size
(und / oder octave
) erhöht werden kann, als nur mit 10 zu sehen, ob es funktioniert ? Ich möchte die Hardcodierung der size
Erhöhung nach Möglichkeit vermeiden und programmgesteuert bestimmen, aber die Hardcodierung ist in Ordnung , solange ich einige solide Argumente habe, die meine Auswahl des neuen Algorithmussize
/ size
Erhöhungs- / size
Schätzalgorithmus stützen .
quelle
Antworten:
Ich bin mir nicht sicher, ob es tatsächlich eine gute Antwort auf Ihre genaue Frage gibt: Das Scale-Space-Ding von SIFT und SURF wurde tatsächlich entwickelt, um die "gute" relevante Nachbarschaftsgröße um einen eckenartigen Schlüsselpunkt automatisch zu schätzen (was gut ist) zu verfolgen sind).
Nun wären positivere Antworten:
Erstellen Sie eine Datenbank mit Schlüsselpunkten und guten Übereinstimmungen (z. B. mithilfe quadratischer Kalibrierungsmuster) und erstellen Sie eine automatisierte Leistungsbewertung für diese Datenbank, um die richtige Größe zu ermitteln. Diese Aufgabe kann tatsächlich wirklich automatisiert werden (siehe die Arbeit von Mikolajczyk und Schmid zur Bewertung der Punktübereinstimmung).
Betten Sie Ihre guten Features in eine Bildpyramide ein, um ihnen auch eine Art Skalierung zuzuordnen. Sie können nach Referenzen zu FAST- und Harris-Interessenpunkten mit mehreren Maßstäben suchen, die diesem Verfahren sehr ähnlich sind.
Um die maximale Blockgröße heuristisch zu ermitteln, können Sie Schätzungen Ihrer Bilder mit einer Box-Unschärfe berechnen (was mehr oder weniger dem BlockSize-Operator entspricht) und sehen, wann die Ecke verschwindet. Beachten Sie jedoch, dass mehr Unschärfe die Ecke von ihrer tatsächlichen Position entfernt.
Wenn Sie wirklich auf der Suche nach einer schnellen und schmutzigen Lösung sind, versuchen Sie es mit Größen zwischen 5 x 5 und 11 x 11 (typische Größen, die beim Stereoblock-Matching verwendet werden). Wenn Sie nach einem intellektuell zufriedenstellenden Kriterium suchen, versuchen Sie, die Wahrscheinlichkeit einer guten Übereinstimmung von zwei Merkmalspunkten unter Ihrem Geräuschpegel zu maximieren.
quelle
Um Ihnen zu helfen, die besten Parameter für die Detektoren zu ermitteln, verfügt OpenCV über den AjusterAdapter für diesen Zweck. Ich habe es selbst nie benutzt, aber es ist wahrscheinlich die Standardmethode, um die Parameter programmgesteuert zu bestimmen. Beachten Sie auch, dass Schlüsselpunkte zwar mehrere Eigenschaften haben, jedoch nicht alle für alle Algorithmen sinnvoll sind. Da die Schlüsselpunktstruktur für verschiedene Algorithmen verwendet wird, enthält sie alle diese Felder, aber manchmal werden sie nicht verwendet. Deshalb erhalten Sie diese Oktave = 0; IMO.
quelle