2010-07-06 23 views
7

Gibt es eine Möglichkeit, opencv Objekte in der Datenbank (wie Oracle, mysql a.s.o) statt XML-Datei zu speichern?Opencv speichern in Datenbank

CvSave ist wie eine Blackbox.

+0

Offen für Open Source ist, müssen Sie den Quellcode, gibt es keine Blackbox – Eric

+0

Thx Eric, du hast Recht. Ich meine, vielleicht gibt es einen einfacheren Weg als das erneute Kompilieren von opencv. Hat sich schon jemand mit opencv und Datenbanken beschäftigt? – Jayka

+0

Ich bin mir ziemlich sicher, wenn Sie die XML-Datei haben, können Sie diese XML-Datei dann analysieren und in einer Datenbank speichern. –

Antwort

10

Ihre Frage ist eine gute Frage. Das Speichern in XML erfordert viel Speicherplatz auf der Festplatte und lädt langsamer. Ich hatte das Problem selbst und schrieb einen kurzen Code, der Mat auf Disc speichert, Sie ändern es, um andere Objekte zu speichern.

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

Vielleicht fügen Sie einen Hinweis, dass Ihr Code nicht mit den signierten Typen wie 'CV_8S' –

+0

Dies beantwortet nicht die eigentliche Frage, ist aber sehr nützlich. – Parmaia