2010-07-06 134 views
7

有沒有辦法將opencv對象保存到數據庫(如oracle,mysql a.s.o)而不是xml文件?Opencv存儲到數據庫

CvSave就像一個黑匣子。

+0

開放是爲開源,你有源代碼,沒有黑盒 – Eric 2010-07-06 21:30:02

+0

Thx埃裏克,你是對的。我的意思是,也許有比重新編譯opencv更簡單的方法。有人已經處理opencv和數據庫嗎? – Jayka 2010-07-07 09:02:36

+0

我敢肯定,如果你有XML文件,你可以解析XML文件並將其保存到數據庫。 – 2010-08-29 02:06:16

回答

10

你的問題是一個很好的問題。 保存到XML需要更多光盤空間並加載速度較慢。 我自己有問題,並寫了一個簡短的代碼,將Mat保存到光盤, 您可以更改它以保存其他對象。

// 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' – 2013-12-29 13:27:34

+0

這並不回答實際問題,但是非常有用。 – Parmaia 2014-02-13 16:28:03