2010-07-06 15 views
7

क्या एक्सएमएल फाइल के बजाय ओपनसीवी ऑब्जेक्ट्स को डेटाबेस (जैसे ओरेकल, mysql a.s.o) में सहेजने का कोई तरीका है?डेटाबेस के लिए ओपनसीवी स्टोर

सीवीएसव एक ब्लैकबॉक्स की तरह है।

+0

ओपन मुक्त स्रोत के लिए है, तो आप स्रोत कोड है, वहाँ कोई ब्लैकबॉक्स – Eric

+0

Thx एरिक, तुम सही हो सकता है। मेरा मतलब था, शायद opencv recompiling से एक आसान तरीका है। क्या किसी ने पहले से ही ओपनसीवी और डेटाबेस के साथ निपटाया है? – Jayka

+0

मुझे यकीन है कि अगर आपके पास xml फ़ाइल है तो आप उस XML फ़ाइल को पार्स कर सकते हैं और उसे डेटाबेस में सहेज सकते हैं। –

उत्तर

10

आपका प्रश्न एक अच्छा है। एक्सएमएल में सहेजने के लिए डिस्क पर बहुत अधिक जगह और धीमी गति लोड की आवश्यकता होती है। मुझे अपनी समस्या थी और एक छोटा कोड लिखा जो डिस्क पर मैट बचाता है, आप इसे अन्य ऑब्जेक्ट्स को सहेजने के लिए बदलते हैं।

// Save matrix to binary file 
int saveMat(const string& filename, const Mat& M){ 
    if (M.empty()){ 
     return 0; 
    } 
    ofstream out(filename.c_str(), ios::out|ios::binary); 
    if (!out) 
     return 0; 

    int cols = M.cols; 
    int rows = M.rows; 
    int chan = M.channels(); 
    int eSiz = (M.dataend-M.datastart)/(cols*rows*chan); 

    // Write header 
    out.write((char*)&cols,sizeof(cols)); 
    out.write((char*)&rows,sizeof(rows)); 
    out.write((char*)&chan,sizeof(chan)); 
    out.write((char*)&eSiz,sizeof(eSiz)); 

    // Write data. 
    if (M.isContinuous()){ 
     out.write((char *)M.data,cols*rows*chan*eSiz); 
    } 
    else{ 
     return 0; 
    } 
    out.close(); 
    return 1; 
} 

/****************************************************************************/ 
// Read matrix from binary file 
int readMat(const string& filename, Mat& M){ 
    ifstream in(filename.c_str(), ios::in|ios::binary); 
    if (!in){ 
     M = NULL_MATRIX; 
     return 0; 
    } 
    int cols; 
    int rows; 
    int chan; 
    int eSiz; 

    // Read header 
    in.read((char*)&cols,sizeof(cols)); 
    in.read((char*)&rows,sizeof(rows)); 
    in.read((char*)&chan,sizeof(chan)); 
    in.read((char*)&eSiz,sizeof(eSiz)); 

    // Determine type of the matrix 
    int type = 0; 
    switch (eSiz){ 
    case sizeof(char): 
     type = CV_8UC(chan); 
     break; 
    case sizeof(float): 
     type = CV_32FC(chan); 
     break; 
    case sizeof(double): 
     type = CV_64FC(chan); 
     break; 
    } 

    // Alocate Matrix. 
    M = Mat(rows,cols,type,Scalar(1)); 

    // Read data. 
    if (M.isContinuous()){ 
     in.read((char *)M.data,cols*rows*chan*eSiz); 
    } 
    else{ 
     return 0; 
    } 
    in.close(); 
    return 1; 
} 
+0

शायद एक नोट जोड़ें कि आपका कोड 'CV_8S' –

+0

जैसे हस्ताक्षरित प्रकारों को संभाल नहीं करता है, यह वास्तविक प्रश्न का उत्तर नहीं देता है, लेकिन यह बेहद उपयोगी है। – Parmaia

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