2014-05-03 10 views
8

Ich versuche Schlüsselpunkte mit ORB zu erkennen, alles ist in Ordnung, bis ich zu Opencv 2.4.9 wechselte.ORB erkennt keyPoints nicht in opencv 2.4.9

Firts, scheint es, dass die Anzahl der Tasten decresed und für einige Bilder sind keine keypoints erkannt:

Dies ist mein Code mit zwei Version kompiliert: (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 Eigenpunkte

kp detected

2,4. 9: Gefunden 0 Eigenpunkte

zero kpts

ich auch mit einem anderen ORB Constructor getestet, aber ich habe das gleiche Ergebnis, keine kpts. die gleichen Werte wie in Konstruktor 2.3.1 Standard-Konstruktor: 2.4.9 benutzerdefinierte constr:

#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 reparieren?

Vielen Dank.

+0

Haben Sie irgendwelche Lösungen bekommen? –

+0

Auf anderen Bildern haben Sie auch 0 Schlüsselpunkte gefunden? Oder nur weniger Keypoints als mit openCV 2.3.1? – Whysmerhill

Antwort

9

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 Flankenschwellwerts ändern, können Sie die Anzahl der erkannten Merkmale erneut erhöhen.

Im Folgenden eine angepasste Version des Codes ist, zu zeigen, was ich meine (vorsichtig, konnte ich testen Sie es nur mit OpenCV 3.0.0, aber ich glaube, Sie erhalten den Punkt).

#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <opencv2/features2d.hpp> 

using namespace cv; 

int main(int argc, char **argv){ 

    Mat img = imread(argv[1]); 

    std::vector<KeyPoint> kp; 

    // Default parameters of ORB 
    int nfeatures=500; 
    float scaleFactor=1.2f; 
    int nlevels=8; 
    int edgeThreshold=15; // Changed default (31); 
    int firstLevel=0; 
    int WTA_K=2; 
    int scoreType=ORB::HARRIS_SCORE; 
    int patchSize=31; 
    int fastThreshold=20; 

    Ptr<ORB> detector = ORB::create(
    nfeatures, 
    scaleFactor, 
    nlevels, 
    edgeThreshold, 
    firstLevel, 
    WTA_K, 
    scoreType, 
    patchSize, 
    fastThreshold); 

    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; 
} 
1

In OpenCV 3.1, zumindest die Parameter edgeThreshold ist tatsächlich die „Größe der Grenze, wo die Merkmale erkannt sind es nicht.“ 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, also Harris-Schlüsselpunkte, nicht nur FAST-Schlüsselpunkte, wie Sie vielleicht aufgrund des Argumentnamens denken. Es ist auch ein bisschen irreführend, weil edgeThreshold selbst wie ein Schwellenwert auf Harris Ecke Erkennung, nicht auf der Seite des Bildes für die Erkennung von Punkten klingt.

Siehe: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0.

Zusätzlich kann die Anzahl der Pyramidenstufen zu erhöhen nlevels könnten Ihnen mehr keypoints geben, obwohl, wenn Ihre Bildgrößen gleich sind und der einzige Unterschied ist Ihre OpenCV Version, es unwahrscheinlich ist, hier zu helfen.

ich in der gleichen Ausgabe lief und hier ist der Code, der gearbeitet:
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 neue keypoints zu erhalten.