2011-07-28 19 views
8

का उपयोग करके कीपॉइंट्स के वेक्टर को कैसे सहेजना है, मैं सोच रहा था कि सीवीफ़ाइलस्टोर क्लास या सीवी :: फाइलस्टोरेज क्लास का उपयोग कर सीवी :: कीपॉइंट्स के वेक्टर को सहेजना संभव था। इसे वापस पढ़ने के लिए भी यही प्रक्रिया है?ओपनसीवी

धन्यवाद।

उत्तर

7

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

यह मानता है कि जब आप उन्हें वापस पढ़ते हैं, तो आप उन्हें जानते हैं पढ़ना चाहते हैं, यदि नहीं, तो कोड थोड़ा और जटिल है। आपको एक रास्ता मिलेगा (यदि उदाहरण के लिए आप फिलास्टोरस पढ़ते हैं और यह आपको जो कुछ भी देता है, उसका परीक्षण नहीं करते हैं, तो इसका मतलब है कि पढ़ने के लिए कोई और बात नहीं है) - यह सिर्फ एक विचार है, आपको करना है समाधान ढूंढें, शायद कोड का यह टुकड़ा आपके लिए पर्याप्त होगा। मुझे सटीक होना चाहिए कि मैं स्ट्रिंग में पूर्णांक डालने के लिए ostringstream का उपयोग करता हूं और वैसे ही उस स्थान को बदलता हूं जहां यह * .yml फ़ाइल में लिखा जाएगा।

//TO WRITE 
vector<Keypoint> myKpVec; 
FileStorage fs(filename,FileStorage::WRITE); 

ostringstream oss; 
for(size_t i;i<myKpVec.size();++i) { 
    oss << i; 
    fs << oss.str() << myKpVec[i]; 
} 
    fs.release(); 

//TO READ 
vector<Keypoint> myKpVec; 
FileStorage fs(filename,FileStorage::READ); 
ostringstream oss; 
Keypoint aKeypoint; 
for(size_t i;i<myKpVec.size();<++i) { 
    oss << i; 
    fs[oss.str()] >> aKeypoint; 
    myKpVec.push_back(aKeypoint); 
} 
fs.release(); 

जुलिएन,

+0

के लिए काम करता है यह अच्छी तरह से काम करता है जाएगा लगता है। मुझे बस एक उदाहरण की आवश्यकता है कि फाइलस्टॉरेज ने लूप को कैसे संभाला। धन्यवाद – Seb

+0

स्पष्ट रूप से फ़ाइलस्टॉरेज आपको एक कुंजी के रूप में नंबर नहीं होने देगा। आपको रन टाइम त्रुटि मिलेगी। "ओपनसीवी त्रुटि: icvYMLWrite में खराब तर्क (कुंजी को एक अक्षर या _ से शुरू होना चाहिए) संख्या स्ट्रिंग के सामने" _ 'जोड़ना है। – DXM

7
char* key; 
FileStorage f; 
vector<Keypoint> keypoints; 

//writing 
write(f, key, keypoints); 

//reading 
read(f[key], keypoints); 
0
int main() { 
String filename = "data.xml"; 
FileStorage fs(filename,FileStorage::WRITE); 
Vector<Mat> vecMat; 
Mat A(3,3,CV_32F, Scalar(5)); 
Mat B(3,3,CV_32F, Scalar(6)); 
Mat C(3,3,CV_32F, Scalar(7)); 
vecMat.push_back(A); 
vecMat.push_back(B); 
vecMat.push_back(C); 
//ostringstream oss; 
for(int i = 0;i<vecMat.size();i++) { 
    stringstream ss; 
    ss << i; 
    string str = "x" + ss.str();   
    fs << str << vecMat[i]; 
} 
fs.release(); 
vector<Mat> matVecRead; 
FileStorage fr(filename,FileStorage::READ); 
Mat aMat; 
int countlabel = 0; 
while(1) { 
    stringstream ss; 
    ss << countlabel; 
    string str = "x" + ss.str(); 
    cout << str << endl; 
    fr[str] >> aMat; 
    if (fr[str].isNone() == 1) { 
     break; 
    } 
    matVecRead.push_back(aMat.clone());  
    countlabel ++; 
} 
fr.release(); 
for(unsigned j = 0; j < matVecRead.size(); j++){ 
    cout << matVecRead[j] << endl; 
} 
} 

एक्सएमएल कुंजी किसी अक्षर से प्रारंभ होना चाहिए निर्दिष्ट एक पत्र जैसे OpenCV एक्सएमएल फॉर्मेट के रूप में नंबरिंग की 'एक' सामने रखो।

यह दृश्य स्टूडियो 2010 के लिए Vector<Mat> बचाने के लिए एक कोड है, मैं इसे Vector<KeyPoints>