Jay*_*yka 7 c++ database opencv
有没有办法将opencv对象保存到数据库(如oracle,mysql aso)而不是xml文件?
CvSave就像一个黑盒子.
Dan*_*HsH 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;
}
Run Code Online (Sandbox Code Playgroud)