2012-05-02 14 views
8

के प्रिंटिंग मान मुझे किसी ओपनसीवी डिस्क्रिप्टर एक्स्ट्रैक्टर की 'गणना' विधि के उपयोग के माध्यम से प्राप्त वर्णक मैट्रिक्स के मानों को प्रिंट करने में कुछ परेशानी हो रही है। मैं एक फीचर के डिस्क्रिप्टर को एक फ़ाइल में एक-एक करके प्रिंट करना चाहता हूं, लेकिन हमेशा जब मैं 'एट' के साथ डिस्क्रिप्टर मैट्रिक्स के कुछ तत्व तक पहुंचता हूं, तो मुझे उस तत्व के लिए एक अलग मान मिलता है। निम्नलिखित है पाश 'के लिए' मैं जब 'पर' का उपयोग कर वर्णनकर्ता मैट्रिक्स के उत्पादन मूल्य का परीक्षण करने के लिए प्रयोग किया जाता एक:कीपॉइंट डिस्क्रिप्टर मैट्रिक्स ओपनसीवी

for(int i=0; i<nF; i++){ 

    if(lpx != keypoints[i].pt.x && lpy != keypoints[i].pt.y){ 
     usedFeatures++; 
     cerr << descriptors.row(i) << endl << endl; // printing row of descriptor matrix 
     fileS << keypoints[i].pt.y << " " << keypoints[i].pt.x << " "; 
     fileS << keypoints[i].size << " " << keypoints[i].angle << endl; 

     if(i == nF - 2){ 
      //printing subvector of descriptor matrix made of the element at row i and col 0 
      cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

      //same as before just inverting the order of access 
      cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 


      //printing the value of the element with 'at' 
      cerr << (int)descriptors.at<uchar>(i, 0); 

      //creating a new int and giving it the value of element (i, 0) of descriptor matrix. Should be the same 
      //value shown on the subvector before 
      int test = descriptors.at<uchar>(i, 0); 

      //printing value of element 
      cerr << "i, 0: " << test << endl; 
     } 

दूसरा 'अगर' एक परीक्षण 'अगर' मैं मान मुद्रित देखने के लिए किया जाता है वर्णनकर्ताओं के तत्वों का उपयोग करते समय। - अब, nF पर

cerr << descriptors.row(i) << endl << endl; 

द्वारा मुद्रित 2 iteraction, मैं निम्नलिखित परिणाम है:

[20, 11, 0, 18, 51, 3, 0, 3, 133, 50, 0, 0, 0, 0, 0, 11, 133, 18, 0, 0, 0, 0, 0, 3, 
119, 2, 0, 0, 0, 0, 0, 2, 19, 5, 0, 4, 55, 27, 1, 1, 133, 25, 0, 1, 4, 1, 0, 22, 133, 
18, 0, 0, 0, 0, 0, 14, 131, 13, 1, 0, 0, 0, 0, 1, 12, 1, 0, 1, 56, 133, 25, 13, 133, 
14, 0, 0, 3, 8, 20, 80, 133, 38, 0, 0, 0, 0, 0, 51, 106, 11, 1, 0, 0, 0, 0, 23, 0, 0, 
0, 0, 19, 126, 70, 11, 23, 0, 0, 0, 0, 9, 83, 133, 53, 1, 0, 0, 0, 0, 2, 133, 26, 
3, 2, 0, 0, 0, 0, 28] 

और अपेक्षा के अनुरूप, दूसरा 'अगर' के अंदर पहले दो प्रिंट:

cerr << "get row i, col 0 " << descriptors.row(i).col(0) << endl; 

cerr << "get col 0, row i: " << descriptors.col(0).row(i) << endl; 

मुझे दे [20]

लेकिन अन्य दो प्रिंट

cerr << (int)descriptors.at<uchar>(i, 0); 

और

int test = descriptors.at<uchar>(i, 0); 
cerr << "i, 0: " << test << endl; 

मुझे के बजाय 0 20. पूरा परिणाम मैं लाइन nF -2 के लिए किया था कि मैंने पहले से पता चला देते हैं, जब 'पर' के साथ तत्वों तक पहुँचने और उन्हें मुद्रण था:

0 0 160 65 0 0 48 65 0 0 0 0 0 0 144 65 0 0 76 66 
0 0 64 64 0 0 0 0 0 0 64 64 0 0 5 67 0 0 72 66 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 48 65 0 0 5 67 0 0 144 65 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 64 0 0 238 66 
0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 64 

जो मैं अपेक्षा कर रहा था उससे बिल्कुल अलग है। मैंने पहले से ही बहुत सी चीजों की कोशिश की है: केवल int की बजाय फ्लोट, डबल, हस्ताक्षरित int के साथ कास्टिंग, और उन प्रकारों के चर को असाइन करना; प्रिंट करने से पहले मैट्रिक्स को परिवर्तित करना, फिर मैट्रिक्स को प्रतिलिपि बनाना, अलग-अलग प्रकार के साथ वर्णनकर्ता मैट्रिक्स बनाना ... लेकिन उनमें से कोई भी काम नहीं करता। मुझे संदेह है कि इसमें डिस्क्रिप्टर मैट्रिक्स के प्रकार के साथ कुछ करना है, हालांकि मुझे लगभग यकीन है कि इसमें उचर प्रकार (मैंने elemSize के साथ चेक किया है)

अग्रिम धन्यवाद, और मेरी अंग्रेजी और आकार के लिए खेद है सवाल।

उत्तर

7

उत्तर मिला। यह वास्तव में एक प्रकार की समस्या थी। द्वारा वर्णित वर्णक मैट्रिक्स का प्रकार uchar जैसा नहीं मैंने सोचा, यह वास्तव में फ्लोट है।

(float)descriptors.at<float>(i, 0); 

साथ मूल्य हो रही है मुझे सही मूल्य देता है। मजेदार बात यह है कि मैं कसम खाता हूं कि मैंने इसे पहले फ्लोट करने की कोशिश की, और यह काम नहीं किया। मैंने केवल int, double और unsigned int के लिए इसे आजमाया होगा।

1

यह उत्तर नहीं देता कि आपकी समस्या क्यों होती है, लेकिन मुझे अपने वर्णनकर्ता मानों तक पहुंचने का प्रयास करते समय समान समस्याएं याद आती हैं।

मैं कोड का एक टुकड़ा लिखने की कोशिश कर रहा था जो किसी भी वर्णनकर्ता के साथ काम करेगा, क्योंकि ओपनसीवी के पास cv::DescriptorExtractor एस लागू है। बात यह है कि, क्योंकि मैं किसी दिन अपने स्वयं के, ओपनसीवी स्वतंत्र पुस्तकालयों को बनाने में सक्षम होना चाहता हूं जो मेरे वर्णनकर्ता इंटरफेस के साथ काम करते हैं, मैं std::vector<vector<double> > संरचनाओं में सभी वर्णनकर्ता चाहता था।

cv::DescriptorExtractor *descCalc; 

// initialize descCalc 

descCalc->compute(*image, feats, descOld); 

// conversion to std::vector<std::vector <double> > : 

const double *temp; 
desc.clear(); 
desc.reserve(descOld.cols); 
for (int i=0, szi = this->desc.rows; i < szi; ++i){ 
    temp = descOld.ptr<double>(i); 
    desc.push_back(std::vector<double>(temp, temp+descOld.cols)); 
} 

assert(desc.size() == descOld.rows); 
assert(desc[0].size() == descOld.cols); 

आशा है कि यह कुछ मदद करता है:

यहाँ मेरी कोड में कनवर्ट करता है कि cv::Mat descOldstd::vector< std::vector <double> > desc है।

+0

धन्यवाद! यद्यपि यह समस्या का समाधान नहीं करता है, लेकिन अभी मैं यह कर रहा हूं, भविष्य में यह रूपांतरण मेरे लिए उपयोगी हो सकता है, इसलिए मैं आपके उत्तर की सराहना करता हूं! –

+0

@Alberto ए मुझे पता है कि यह आपकी समस्या के "क्यों" का जवाब नहीं देता है, लेकिन आप वर्णनकर्ताओं को 'डबल' के रूप में एक्सेस करने का प्रयास कर सकते हैं? मेरे मामले में, 'temp' पंक्ति की शुरुआत के लिए सिर्फ एक सूचक है, लेकिन' temp' का उपयोग कर पंक्ति का पहला तत्व प्राप्त करने के लिए, मुझे केवल 'डबल वैल = * temp' होना होगा। शायद ऐसा करने की कोशिश करो? मुझे पता है कि मुझे वर्णनकर्ताओं तक पहुंचने के लिए उपयुक्त प्रकार खोजने में भी मुश्किल समय था। – penelope

संबंधित मुद्दे