diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp index 66c963132bdaf46a9095fcd016c3507bf4d5dd45..3f18d54a399abc06d003e31559c69ba544668d3d 100644 --- a/modules/core/include/opencv2/core/persistence.hpp +++ b/modules/core/include/opencv2/core/persistence.hpp @@ -958,7 +958,6 @@ void write( FileStorage& fs, const std::vector<_Tp>& vec ) w(vec); } - template static inline void write(FileStorage& fs, const String& name, const Point_<_Tp>& pt ) { @@ -1022,6 +1021,17 @@ void write( FileStorage& fs, const String& name, const std::vector<_Tp>& vec ) write(fs, vec); } +template static inline +void write( FileStorage& fs, const String& name, const std::vector< std::vector<_Tp> >& vec ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ); + for(size_t i = 0; i < vec.size(); i++) + { + cv::internal::WriteStructContext ws_(fs, name, FileNode::SEQ+(DataType<_Tp>::fmt != 0 ? FileNode::FLOW : 0)); + write(fs, vec[i]); + } +} + //! @} FileStorage //! @relates cv::FileNode diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 34915cc6ef5b685e1417d7d9cf8830e68aeaff41..eb02a7b23df638aec4bd10b8e05346ea94b77bb9 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -950,3 +950,49 @@ TEST(Core_InputOutput, filestorage_utf8_bom) fs.release(); }); } + +TEST(Core_InputOutput, filestorage_vec_vec_io) +{ + std::vector > outputMats(3); + for(size_t i = 0; i < outputMats.size(); i++) + { + outputMats[i].resize(i+1); + for(size_t j = 0; j < outputMats[i].size(); j++) + { + outputMats[i][j] = Mat::eye((int)i + 1, (int)i + 1, CV_8U); + } + } + + String fileName = "vec_test."; + + std::vector formats; + formats.push_back("xml"); + formats.push_back("yml"); + formats.push_back("json"); + + for(size_t i = 0; i < formats.size(); i++) + { + FileStorage writer(fileName + formats[i], FileStorage::WRITE); + writer << "vecVecMat" << outputMats; + writer.release(); + + FileStorage reader(fileName + formats[i], FileStorage::READ); + std::vector > testMats; + reader["vecVecMat"] >> testMats; + + ASSERT_EQ(testMats.size(), testMats.size()); + + for(size_t j = 0; j < testMats.size(); j++) + { + ASSERT_EQ(testMats[j].size(), outputMats[j].size()); + + for(size_t k = 0; k < testMats[j].size(); k++) + { + ASSERT_TRUE(norm(outputMats[j][k] - testMats[j][k], NORM_INF) == 0); + } + } + + reader.release(); + remove((fileName + formats[i]).c_str()); + } +}