core: FileStorage - add support for writing vector<String> with bindings (#11883)
authorPavel Rojtberg <rojtberg@gmail.com>
Tue, 17 Jul 2018 10:38:48 +0000 (12:38 +0200)
committerVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Tue, 17 Jul 2018 10:38:48 +0000 (13:38 +0300)
* core: FileStorage - add support for writing vector<String> with bindings

* python: extend persistence test for string sequences

modules/core/include/opencv2/core/persistence.hpp
modules/core/src/persistence_cpp.cpp
modules/python/test/test_persistence.py

index 5103c7d..5b2bb84 100644 (file)
@@ -444,7 +444,9 @@ public:
     /// @overload
     CV_WRAP void write(const String& name, const String& val);
     /// @overload
-    CV_WRAP void write(const String& name, InputArray val);
+    CV_WRAP void write(const String& name, const Mat& val);
+    /// @overload
+    CV_WRAP void write(const String& name, const std::vector<String>& val);
 
     /** @brief Writes a comment.
 
index ab1b1f0..29984db 100644 (file)
@@ -194,9 +194,14 @@ void FileStorage::write( const String& name, const String& val )
     *this << name << val;
 }
 
-void FileStorage::write( const String& name, InputArray val )
+void FileStorage::write( const String& name, const Mat& val )
 {
-    *this << name << val.getMat();
+    *this << name << val;
+}
+
+void FileStorage::write( const String& name, const std::vector<String>& val )
+{
+    *this << name << val;
 }
 
 void FileStorage::writeComment( const String& comment, bool append )
index dcfce6e..4c1ec8e 100644 (file)
@@ -14,14 +14,17 @@ class persistence_test(NewOpenCVTests):
 
         # Writing ...
         expected = np.array([[[0, 1, 2, 3, 4]]])
+        expected_str = ("Hello", "World", "!")
         fs = cv.FileStorage(fname, cv.FILE_STORAGE_WRITE)
         fs.write("test", expected)
+        fs.write("strings", expected_str)
         fs.release()
 
         # Reading ...
         fs = cv.FileStorage(fname, cv.FILE_STORAGE_READ)
         root = fs.getFirstTopLevelNode()
         self.assertEqual(root.name(), "test")
+
         test = fs.getNode("test")
         self.assertEqual(test.empty(), False)
         self.assertEqual(test.name(), "test")
@@ -30,6 +33,12 @@ class persistence_test(NewOpenCVTests):
         actual = test.mat()
         self.assertEqual(actual.shape, expected.shape)
         self.assertEqual(np.array_equal(expected, actual), True)
+
+        strings = fs.getNode("strings")
+        self.assertEqual(strings.isSeq(), True)
+        self.assertEqual(strings.size(), len(expected_str))
+        self.assertEqual(all(strings.at(i).isString() for i in range(strings.size())), True)
+        self.assertSequenceEqual([strings.at(i).string() for i in range(strings.size())], expected_str)
         fs.release()
 
         os.remove(fname)