2010-07-06 27 views
7

¿Hay alguna manera de guardar los objetos opencv en la base de datos (como oracle, mysql a.s.o) en vez de en el archivo xml?Tienda Opencv a la base de datos

CvSave es como un blackbox.

+0

abierto es de código abierto, que tienen el código fuente, no hay una caja negra – Eric

+0

Thx Eric, tienes razón. Quiero decir, tal vez hay una manera más fácil que recompilar opencv. ¿Alguien ya ha tratado con opencv y bases de datos? – Jayka

+0

estoy bastante seguro de que si tienes el archivo xml puedes analizar ese archivo xml y guardarlo en una base de datos. –

Respuesta

10

Su pregunta es buena. Guardar en XML requiere mucho más espacio en disco y carga más lento. Tuve el problema yo mismo y escribí un código corto que guarda Mat en el disco, Lo cambia para guardar otros objetos.

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

Quizás agregue una nota de que su código no maneja los tipos firmados como 'CV_8S' –

+0

Esto no responde la pregunta real, pero es extremadamente útil. – Parmaia

Cuestiones relacionadas