Ich versuche ein sehr einfaches Programm zum Finden von Ähnlichkeiten zwischen zwei Bildern zu implementieren.
Ich verwende den ORB-Feature-Detektor und den Bilddeskriptor für diese Aufgabe und identifiziere die Übereinstimmungen mit knnMatch :
%Vor%Ich kann die Matches wie folgt zeichnen:
%Vor%Das Problem ist, dass es zu viele Übereinstimmungen gibt und auch solche, die weit entfernt sind. Ich kann anscheinend nicht finden, wie man nur die guten Übereinstimmungen herausholt (eine Schwelle überschreitend)? Könnte jemand mich in die richtige Richtung weisen oder mich zu einem grundlegenden Arbeitsbeispiel umleiten? Ich habe mehrere Stunden damit verbracht und scheint verloren zu sein.
Ich habe versucht, Keypoint Matching funktioniert einfach zwei Mal ... ? (java opencv) , aber die Standard (nicht-knn) Übereinstimmung verwendet verschiedene Strukturen und ich konnte es nicht funktionieren lassen.
Wie in anderen Antworten erwähnt, gibt es mehrere Methoden, um Ausreißer und schlechte Übereinstimmungen zu entfernen. Ich denke, Sie haben Beispiele und Tutorials mit match
anstelle von knnMatch
mit einigen dieser Methoden gefunden.
Wie Sie vielleicht wissen, gibt knnMatch
die n-besten Treffer in descriptor2
für jeden Deskriptor in descriptor1
zurück. Das bedeutet, dass Sie anstelle einer Trefferliste eine Liste mit Übereinstimmungen erhalten. Ich schätze, das ist der Grund, warum du Probleme hattest.
Der Hauptvorteil von knnMatch
besteht darin, dass Sie einen Verhältnistest durchführen können. Wenn also die Abstände von einem Deskriptor in descriptor1
zu den beiden besten Deskriptoren in descriptor2
ähnlich sind, deutet dies darauf hin, dass sich in Ihren Bildern repetitive Muster befinden (z. B. die Spitzen eines Palisadenzauns vor Gras). Daher sind solche Übereinstimmungen nicht zuverlässig und sollten entfernt werden.
(Ich bin mir nicht sicher, warum Sie nach den fünf besten Übereinstimmungen suchen - Sie übergeben 5 an knnMatch
- für jeden Deskriptor. Suchen Sie stattdessen nach zwei.)
Wenn Sie jetzt nur für jeden Deskriptor auf die beste Übereinstimmung zugreifen möchten, müssen Sie nur auf das erste Element der "Unterlisten" zugreifen. Im Folgenden finden Sie als Beispiel einen Verhältnis-Test und eine Homographie-Schätzung mit RANSAC (ich habe alles nach Ihrem knnMatch
ersetzt):
Ich hoffe, das ist als Beispiel ausreichend. Andere Filtermethoden könnten analog angewendet werden. Zögern Sie nicht zu fragen, wenn Sie weitere Fragen haben.
BEARBEITEN: Die Homographie-Filterung ist nur dann gültig, wenn sich die meisten Ihrer Schlüsselpunkte auf derselben Ebene in der Szene befinden, wie eine Mauer usw.