2014-05-03 5 views
8

में कीपॉइंट्स का पता नहीं लगा रहा है। मैं ओआरबी के साथ कीपॉइंट्स का पता लगाने की कोशिश कर रहा हूं सब ठीक है जब तक कि मैं ओपनसीवी 2.4.9 पर स्विच नहीं करता।ओआरबी ओपनसीवी 2.4.9

firts, ऐसा लगता है कि कुंजियों की संख्या decresed, और कुछ छवियों के लिए, कोई keypoints पता चला है: (2.3.1 और 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; 
} 

परिणाम: 2.3.1: मिले 152 keypoints

kp detected

2,4। 9: मिला 0 keypoints

zero kpts

मैं भी एक अलग ओर्ब निर्माता के साथ परीक्षण किया है, लेकिन मैं एक ही परिणाम मिलता है, कोई KPts। 2.3.1 डिफ़ॉल्ट के निर्माता के रूप में एक ही constuctor मान: 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; 

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

क्या आपको पता है क्या हो रहा है है? और मैं इसे कैसे ठीक कर सकता हूं?

धन्यवाद।

+0

क्या आपको कोई समाधान मिला? –

+0

अन्य छवियों पर आपको 0 कीपॉइंट्स भी मिलीं? या ओपनसीवी 2.3.1 के मुकाबले कम महत्वपूर्ण बिंदु? – Whysmerhill

उत्तर

9

ओपनसीवी में ओआरबी का कार्यान्वयन संस्करण 2.3.1 और 2.4.9 के बीच काफी महत्वपूर्ण रूप से बदल गया है। पिन-पॉइंट करना मुश्किल है कि एक बदलाव जो आपके द्वारा देखे गए व्यवहार को समझा सकता है।

हालांकि, किनारे सीमा के मूल्य को बदलकर आप फिर से पता लगाई गई सुविधाओं की संख्या बढ़ा सकते हैं।

नीचे आपके कोड का एक अनुकूलित संस्करण है जो मेरा मतलब है (सावधान, मैं केवल ओपनसीवी 3.0.0 के साथ इसका परीक्षण कर सकता हूं, लेकिन मुझे लगता है कि आपको बिंदु मिल गया है)।

#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

OpenCV 3.1 में, कम से कम, edgeThreshold पैरामीटर वास्तव में "सीमा जहां सुविधाओं का पता नहीं चलने के आकार है।" अतिरिक्त सुविधाओं का पता लगाने का एक तरीका fastThreshold पैरामीटर को कम करना है। यह एक भ्रामक नाम है क्योंकि यह थ्रेसहोल्ड ORB::HARRIS_SCORE का उपयोग करते समय भी पता लगाए गए कोनों की संख्या को प्रभावित करता है, जो कि हैरिस कीपॉइंट्स है, न केवल तेज कुंजीपॉइंट्स, जैसा कि आप तर्क नाम के आधार पर सोच सकते हैं। यह भी थोड़ा भ्रामक है क्योंकि edgeThreshold ही हैरिस कोने का पता लगाने पर थ्रेसहोल्ड की तरह लगता है, न कि अंक का पता लगाने के लिए उपयोग की गई छवि के हिस्से पर।

देखें: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0

इसके अतिरिक्त, पिरामिड स्तरों की संख्या में वृद्धि nlevels आपको और अधिक महत्वपूर्ण बिंदु दे सकती है, हालांकि यदि आपकी छवि का आकार समान है और आपका ओपनसीवी संस्करण केवल अंतर है, तो यहां सहायता करने की संभावना नहीं है।

मैं एक ही मुद्दे में भाग गया और यहां कोड है जो काम करता है:
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);

अंतिम तर्क (20, ऊपर) fastThreshold नया कुंजीपटल प्राप्त करने के लिए कम करने के लिए है।