diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp index 23714868b..6ceeca438 100644 --- a/modules/core/include/opencv2/core/persistence.hpp +++ b/modules/core/include/opencv2/core/persistence.hpp @@ -89,6 +89,8 @@ the extension of the opened file, ".xml" for XML files and ".yml" or ".yaml" for */ typedef struct CvFileStorage CvFileStorage; typedef struct CvFileNode CvFileNode; +typedef struct CvMat CvMat; +typedef struct CvMatND CvMatND; //! @} core_c @@ -1239,9 +1241,11 @@ inline String::String(const FileNode& fn): cstr_(0), len_(0) { read(fn, *this, * //! @endcond -CV_EXPORTS void cvWriteRawData_Base64(::cv::FileStorage & fs, const void* _data, int len, const char* dt); +CV_EXPORTS void cvWriteRawData_Base64(FileStorage & fs, const void* _data, int len, const char* dt); -CV_EXPORTS void cvWriteMat_Base64(::cv::FileStorage & fs, ::cv::String const & name, ::cv::Mat const & mat); +CV_EXPORTS void cvWriteMat_Base64(::CvFileStorage* fs, const char* name, const ::CvMat* mat); + +CV_EXPORTS void cvWriteMatND_Base64(::CvFileStorage* fs, const char* name, const ::CvMatND* mat); } // cv diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index ad8f9eaab..fade7a71a 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -320,7 +320,7 @@ namespace base64 /* sample */ void cvWriteRawData_Base64(::cv::FileStorage & fs, const void* _data, int len, const char* dt); - void cvWriteMat_Base64(::cv::FileStorage & fs, ::cv::String const & name, ::cv::Mat const & mat); + void cvWriteMat_Base64(CvFileStorage * fs, const char * name, ::cv::Mat const & mat); } @@ -6960,7 +6960,7 @@ void base64::cvWriteRawData_Base64(cv::FileStorage & fs, const void* _data, int cvEndWriteStruct(*fs); } -void base64::cvWriteMat_Base64(cv::FileStorage & fs, cv::String const & name, cv::Mat const & mat) +void base64::cvWriteMat_Base64(CvFileStorage * fs, const char * name, cv::Mat const & mat) { char dt[4]; ::icvEncodeFormat(CV_MAT_TYPE(mat.type()), dt); @@ -6968,23 +6968,23 @@ void base64::cvWriteMat_Base64(cv::FileStorage & fs, cv::String const & name, cv { /* [1]output other attr */ if (mat.dims <= 2) { - cvStartWriteStruct(*fs, name.c_str(), CV_NODE_MAP, CV_TYPE_NAME_MAT); + cvStartWriteStruct(fs, name, CV_NODE_MAP, CV_TYPE_NAME_MAT); - cvWriteInt(*fs, "rows", mat.rows ); - cvWriteInt(*fs, "cols", mat.cols ); + cvWriteInt(fs, "rows", mat.rows ); + cvWriteInt(fs, "cols", mat.cols ); } else { - cvStartWriteStruct(*fs, name.c_str(), CV_NODE_MAP, CV_TYPE_NAME_MATND); + cvStartWriteStruct(fs, name, CV_NODE_MAP, CV_TYPE_NAME_MATND); - cvStartWriteStruct(*fs, "sizes", CV_NODE_SEQ | CV_NODE_FLOW); - cvWriteRawData(*fs, mat.size.p, mat.dims, "i"); - cvEndWriteStruct(*fs); + cvStartWriteStruct(fs, "sizes", CV_NODE_SEQ | CV_NODE_FLOW); + cvWriteRawData(fs, mat.size.p, mat.dims, "i"); + cvEndWriteStruct(fs); } - cvWriteString(*fs, "dt", ::icvEncodeFormat(CV_MAT_TYPE(mat.type()), dt ), 0 ); + cvWriteString(fs, "dt", ::icvEncodeFormat(CV_MAT_TYPE(mat.type()), dt ), 0 ); } - cvStartWriteStruct(*fs, "data", CV_NODE_SEQ, "binary"); + cvStartWriteStruct(fs, "data", CV_NODE_SEQ, "binary"); { /* [2]deal with matrix's data */ - Base64ContextEmitter emitter(*fs); + Base64ContextEmitter emitter(fs); { /* [2][1]define base64 header */ /* total byte size */ @@ -7002,10 +7002,10 @@ void base64::cvWriteMat_Base64(cv::FileStorage & fs, cv::String const & name, cv emitter.write(convertor); } } - cvEndWriteStruct(*fs); + cvEndWriteStruct(fs); { /* [3]output end */ - cvEndWriteStruct(*fs); + cvEndWriteStruct(fs); } } @@ -7020,9 +7020,16 @@ namespace cv ::base64::cvWriteRawData_Base64(fs, _data, len, dt); } - void cvWriteMat_Base64(::cv::FileStorage & fs, ::cv::String const & name, ::cv::Mat const & mat) + void cvWriteMat_Base64(::CvFileStorage* fs, const char* name, const ::CvMat* mat) { - ::base64::cvWriteMat_Base64(fs, name, mat); + ::cv::Mat holder = ::cv::cvarrToMat(mat); + ::base64::cvWriteMat_Base64(fs, name, holder); + } + + void cvWriteMatND_Base64(::CvFileStorage* fs, const char* name, const ::CvMatND* mat) + { + ::cv::Mat holder = ::cv::cvarrToMat(mat); + ::base64::cvWriteMat_Base64(fs, name, holder); } } diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 1410b26d2..99646e43f 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -610,9 +610,12 @@ TEST(Core_InputOutput, filestorage_yml_base64) { /* write */ cv::FileStorage fs("test.yml", cv::FileStorage::WRITE); - cv::cvWriteMat_Base64(fs, "normal_2d_mat", _2d_out); - cv::cvWriteMat_Base64(fs, "normal_nd_mat", _nd_out); - cv::cvWriteMat_Base64(fs, "empty_2d_mat", _em_out); + CvMat holder = _2d_out; + cv::cvWriteMat_Base64(*fs, "normal_2d_mat", &holder); + CvMatND holder_nd = _nd_out; + cv::cvWriteMatND_Base64(*fs, "normal_nd_mat", &holder_nd); + holder = _em_out; + cv::cvWriteMat_Base64(*fs, "empty_2d_mat", &holder); fs.release(); } @@ -672,9 +675,12 @@ TEST(Core_InputOutput, filestorage_xml_base64) { /* write */ cv::FileStorage fs("test.xml", cv::FileStorage::WRITE); - cv::cvWriteMat_Base64(fs, "normal_2d_mat", _2d_out); - cv::cvWriteMat_Base64(fs, "normal_nd_mat", _nd_out); - cv::cvWriteMat_Base64(fs, "empty_2d_mat", _em_out); + CvMat holder = _2d_out; + cv::cvWriteMat_Base64(*fs, "normal_2d_mat", &holder); + CvMatND holder_nd = _nd_out; + cv::cvWriteMatND_Base64(*fs, "normal_nd_mat", &holder_nd); + holder = _em_out; + cv::cvWriteMat_Base64(*fs, "empty_2d_mat", &holder); fs.release(); }