2010-04-12 14 views
13

पुरानी, ​​सी शैली सीवीमैट मैट्रिस को एक XML फ़ाइल में आसान लेखन के लिए cvSave() फ़ंक्शन में पारित किया जा सकता है। नई सी ++ शैली cv::Mat और cv::Mat_ मैट्रिस इस फ़ंक्शन द्वारा स्वीकार नहीं किए जाते हैं।ओपनसीवी में नई सी ++ स्टाइल मैट्रिक्स ऑब्जेक्ट्स को एक्सएमएल से मैं कैसे सहेज सकता हूं और पढ़ सकता हूं?

ओपनसीवी संदर्भ में XML दृढ़ता पर एक अनुभाग है, लेकिन तीन वर्ग (फ़ाइलस्टोर, फ़ाइल नोड और फ़ाइल नोडइटरेटर) में कोई विवरण या उदाहरण नहीं है और मैं यह नहीं समझ सकता कि इंटरफ़ेस से उनका उपयोग कैसे किया जाए।

धन्यवाद।

संपादित: यह वास्तव में, OpenCV के नए सी ++ इंटरफ़ेस की अन्य कार्यक्षमता का एक बहुत से संबंधित है संस्करण 2.1 के रूप में। दस्तावेजों में दस्तावेज बहुत खराब हैं, फ़ंक्शन तर्क असंगत हैं, और उपयोगकर्ता समूह को कोई जानकारी नहीं है, या उत्तर प्रश्नों की तुलना में बेहतर चीजें हैं। मैं थोड़ी देर के लिए पुराने सी इंटरफ़ेस तक चिपकने जा रहा हूं। O'Reilly द्वारा पुस्तक का उल्लेख न करने के लिए दस्तावेज़ बेहतर हैं।

उत्तर

15

स्पष्ट रूप से सी ++ शैली में यह आसान है, लेकिन जैसा कि आपने कहा है कि कोई आसानी से उपलब्ध दस्तावेज नहीं हैं।

फ़ाइल में cv::Mat लिखने के लिए बस एक FileStorage चर बनाएँ और फिर उस शैली में मैट्रिक्स लिखें जिसे आप स्क्रीन पर प्रिंट करने के लिए cout का उपयोग करते हैं।

cv::Mat someMatrix; 
//you create and assign values to someMatrix however you plan to. 
FileStorage fs("myFile.yml", FileStorage::WRITE); 
fs << "name_to_identify_matrix_by" << someMatrix; 

पढ़ना सीन शैली के समान भी है, लेकिन बेहतर है कि आप बेहतर समझने के लिए नीचे दिए गए लिंक पर एक नज़र डालें। अनुभाग डेटा I/O में दूसरे पृष्ठ पर उन्होंने XML/YAML का उपयोग करने के तरीके पर उदाहरण दिखाए हैं।

opencv C++ cheatsheet(different than cheatsheet in the documentation PDF)

9

ऊपर सही है, लेकिन क्या cheatsheet प्रदर्शित नहीं करता है कि आप फ़ाइल को खोलने की जरूरत है। यह स्पष्ट प्रतीत हो सकता है, लेकिन मैंने ऐसा करने की उपेक्षा की क्योंकि चीटशीट ने यह नहीं कहा था कि मुझे करना है।

// write Mat objects to the freakin file 
FileStorage fs("CamModel.yml", FileStorage::WRITE); 
if (!fs.isOpened()){ 
fs.open("CamModel.yml", FileStorage::WRITE); 
fs << "mtxCam" << cameraMatrix; 
fs << "mtxDist" << distCoeffs; 
fs.release(); 
} 

// to test that it really worked, read the Mats back in 
if (!fs.isOpened()){ 
fs.open("CamModel.yml", FileStorage::READ); 
fs["mtxCam"] >> cameraMatrix; 
fs["mtxDist"] >> distCoeffs; 
fs.release(); 
} 

कोई बात नहीं, यह अभी भी काम नहीं करता है: यहाँ कोड है कि आप फ़ाइलों को सही ढंग

---------- कोड लिखने के लिए अनुमति देगा। बर्बाद पोस्ट के लिए खेद है।

+0

हाँ ... जब मैंने इसे पहले पोस्ट किया था तो मैं पूरी तरह गलत था। लाइन फ़ाइल स्टोरेज एफएस ("CamModel.yml", फाइलस्टोरेज :: WRITE); फाइल खोलता है मेरी समस्या यह थी कि फ़ाइल नाम जो मैं खोलने की कोशिश कर रहा था वह मेरे फ़ाइल नाम की शुरुआत से जुड़े वर्णों की एक स्ट्रिंग के कारण अपरिहार्य था। चीटशीट में दिए गए निर्देश बिल्कुल सही हैं। – NotNamedDwayne

+0

किसी भी तरह के फाइल ऑपरेशंस का प्रदर्शन, मुझे लगता है कि हमें fs.isOpened() जैसे चेक का उपयोग करना चाहिए। यही कारण है कि मुझे आपका कोड पसंद है। –

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

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