Ich versuche Schlüsselpunkte mit ORB zu erkennen, alles ist in Ordnung, bis ich zu Opencv 2.4.9 gewechselt habe.
Vorne scheint die Anzahl der Tasten verringert zu sein, und für einige Bilder wurden keine Schlüsselpunkte erkannt:
Dies ist mein Code, der mit zwei Versionen kompiliert wurde: (2.3.1 und 2.4.9)
%Vor%Ergebnis: 2.3.1: Gefunden 152 Schlüsselpunkte
2.4.9: Gefunden 0 Schlüsselpunkte
Ich habe auch mit einem anderen ORB-Konstruktor getestet, aber ich bekomme das gleiche Ergebnis, keine KPts. Die gleichen Konstruktorwerte wie im Konstruktor von 2.3.1 default: 2.4.9 benutzerdefinierte Konstruktion:
%Vor%Hast du eine Idee, was passiert? Und wie kann ich es beheben?
Danke.
Die Implementierung von ORB in OpenCV hat sich zwischen Version 2.3.1 und 2.4.9 erheblich geändert. Es ist schwer festzustellen, dass eine Änderung das beobachtete Verhalten erklären kann.
Wenn Sie jedoch den Wert des Kantenschwellwerts ändern, können Sie die Anzahl der erkannten Features erneut erhöhen.
Unten ist eine angepasste Version Ihres Codes, um zu zeigen, was ich meine (Vorsicht, ich konnte es nur mit OpenCV 3.0.0 testen, aber ich schätze, Sie bekommen den Punkt).
%Vor% In OpenCV 3.1 ist der Parameter edgeThreshold
tatsächlich die "Größe des Rahmens, an dem die Features nicht erkannt werden". Eine Möglichkeit, zusätzliche Funktionen zu erkennen, besteht darin, den Parameter fastThreshold
zu verringern. Es ist ein irreführender Name, da dieser Schwellenwert die Anzahl der erkannten Ecken beeinflusst, selbst wenn ORB::HARRIS_SCORE
verwendet wird. Dies sind Harris-Schlüsselpunkte und nicht nur FAST-Schlüsselpunkte, wie Sie vielleicht aufgrund des Argumentnamens denken. Es ist auch ein wenig irreführend, weil edgeThreshold
selbst bei Harris Corner Detection wie ein Schwellenwert klingt, nicht auf dem Teil des Bildes, der zum Erkennen von Punkten verwendet wird.
Siehe: Ссылка .
Darüber hinaus könnte die Erhöhung der Anzahl der Pyramidenebenen nlevels
Ihnen mehr Schlüsselpunkte geben, auch wenn Ihre Bildgrößen gleich sind und der einzige Unterschied Ihre OpenCV-Version ist, ist es unwahrscheinlich, dass sie hier hilft.
Ich stieß auf das gleiche Problem und hier ist der Code, der funktioniert:
std::vector<KeyPoint> kpts1;
Mat desc1;
Ptr<ORB> orb = ORB::create(100, 2, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20);
orb->detectAndCompute(input_image, Mat(), kpts1, desc1);
Das letzte Argument (20, oben) ist die fastThreshold
zu verringern, um neue Schlüsselpunkte zu erhalten .
Tags und Links c++ opencv feature-detection orb