ORB ist nicht zu erkennen, Eckdaten in opencv 2.4.9
Ich versuche zu erkennen Eckdaten mit ORB ist alles in Ordnung, bis ich eingeschaltet, um Opencv 2.4.9.
Aufbauen, es scheint, dass die Anzahl der Schlüssel, decresed, und für einige Bilder, keine Eckdaten erkannt werden :
Dies ist mein code, kompiliert mit version zwei : (2.3.1 und 2.4.9)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
OrbFeatureDetector detector;
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
Ergebnis :
2.3.1 :
Gefunden 152 Eckdaten
2.4.9 :
Gefunden 0 Eckdaten
Habe ich auch getestet mit verschiedenen ORB-Konstruktor, aber ich bekomme das gleiche Ergebnis, keine KPts.
Das gleiche constuctor Werte wie in 2.3.1 Standard-Konstruktor :
2.4.9 benutzerdefinierte KONSTR :
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
//default in 2.4.9 is : ORB(700, 1.2f, 3, 31, 0);
OrbFeatureDetector detector(500, 1.2f, 8, 31, 0); //default values of 2.3.1
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
Haben Sie eine Ahnung, was passiert ? Und wie kann ich es beheben ?
Danke.
- Haben Sie irgendwelche Lösungen?
- Auf anderen Bilder, die Sie gefunden 0 Eckdaten zu ? Oder einfach nur weniger Eckdaten als mit openCV 2.3.1 ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Umsetzung der Kugel in OpenCV geändert hat ziemlich deutlich zwischen den Versionen 2.3.1 und 2.4.9. Es ist schwer zu pin-point, dass ein Wandel erklären können, dass das Verhalten, das Sie beobachtet.
Jedoch, indem Sie den Wert des Rand-Schwellwert erhöhen Sie die Anzahl der zu erfassenden Merkmale wieder.
Unten ist eine angepasste version des Codes, um zu zeigen, was ich meine (Vorsicht, konnte ich nur testen Sie es mit OpenCV 3.0.0, aber ich denke, Sie erhalten den Punkt).
In OpenCV 3.1, zumindest die
edgeThreshold
parameter ist eigentlich die "Größe der Grenze, wo die Funktionen nicht erkannt werden." Eine Möglichkeit zum erkennen von zusätzlichen Funktionen ist zu verringern Sie diefastThreshold
parameter. Es ist ein irreführender name, da dieser Schwellenwert Auswirkungen auf die Zahl der Ecken entdeckt werden, auch wenn mitORB::HARRIS_SCORE
, dass Harris Eckdaten, die nicht nur SCHNELL Eckdaten, wie Sie vielleicht denken basiert auf dem argument-name. Es ist auch ein bisschen irreführend, weiledgeThreshold
selbst klingt wie eine Schwelle, auf der Harris corner detection, die nicht auf dem Teil des Bildes, das für die Erkennung Punkte.Finden Sie unter: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0.
Darüber hinaus die Erhöhung der Anzahl der Ebenen der Pyramide
nlevels
kann dir noch mehr Eckdaten, obwohl, wenn das Bild-Größen sind die gleichen und der einzige Unterschied ist Ihre OpenCV-version, ist es unwahrscheinlich, hier zu helfen.Ich lief in das gleiche Problem und hier ist der code, der funktioniert hat:
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 der
fastThreshold
zu verringern, um neue Eckdaten.