2010-07-06 30 views
7

Có cách nào để lưu các đối tượng opencv vào cơ sở dữ liệu (như oracle, mysql a.s.o) thay vì tệp xml không?Mở cửa hàng vào cơ sở dữ liệu

CvSave giống như hộp đen.

+0

Mở là dành cho Nguồn mở, bạn có mã nguồn, không có hộp đen – Eric

+0

Thx Eric, bạn nói đúng. Tôi có nghĩa là, có lẽ có một cách dễ dàng hơn so với biên dịch lại opencv. Có ai đã xử lý với opencv và cơ sở dữ liệu? – Jayka

+0

Tôi khá chắc chắn nếu bạn có tệp xml, bạn có thể phân tích cú pháp tệp xml đó và lưu nó vào cơ sở dữ liệu. –

Trả lời

10

Câu hỏi của bạn là câu hỏi hay. Lưu vào XML đòi hỏi nhiều không gian hơn trên đĩa và tải chậm hơn. Tôi đã có vấn đề bản thân mình và đã viết một mã ngắn mà tiết kiệm Mat vào đĩa, Bạn thay đổi nó để lưu các đối tượng khác.

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

Có thể thêm một lưu ý rằng mã của bạn không xử lý các loại đã ký như 'CV_8S' –

+0

Điều này không trả lời câu hỏi thực tế, nhưng cực kỳ hữu ích. – Parmaia

Các vấn đề liên quan