added read/write functions for vector<DMatch> + the test (http://code.opencv.org...
authorVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Mon, 18 May 2015 15:59:37 +0000 (18:59 +0300)
committerVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Mon, 18 May 2015 15:59:37 +0000 (18:59 +0300)
modules/core/include/opencv2/core/persistence.hpp
modules/core/src/persistence.cpp
modules/features2d/test/test_matchers_algorithmic.cpp

index eec304d..17686dd 100644 (file)
@@ -660,6 +660,7 @@ CV_EXPORTS void write( FileStorage& fs, const String& name, const String& value
 CV_EXPORTS void write( FileStorage& fs, const String& name, const Mat& value );
 CV_EXPORTS void write( FileStorage& fs, const String& name, const SparseMat& value );
 CV_EXPORTS void write( FileStorage& fs, const String& name, const std::vector<KeyPoint>& value);
+CV_EXPORTS void write( FileStorage& fs, const String& name, const std::vector<DMatch>& value);
 
 CV_EXPORTS void writeScalar( FileStorage& fs, int value );
 CV_EXPORTS void writeScalar( FileStorage& fs, float value );
@@ -678,6 +679,7 @@ CV_EXPORTS void read(const FileNode& node, String& value, const String& default_
 CV_EXPORTS void read(const FileNode& node, Mat& mat, const Mat& default_mat = Mat() );
 CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat = SparseMat() );
 CV_EXPORTS void read(const FileNode& node, std::vector<KeyPoint>& keypoints);
+CV_EXPORTS void read(const FileNode& node, std::vector<DMatch>& matches);
 
 template<typename _Tp> static inline void read(const FileNode& node, Point_<_Tp>& value, const Point_<_Tp>& default_value)
 {
index 002ff01..9c7b0f2 100644 (file)
@@ -5594,6 +5594,35 @@ void read(const FileNode& node, std::vector<KeyPoint>& keypoints)
     }
 }
 
+
+void write(FileStorage& fs, const String& objname, const std::vector<DMatch>& matches)
+{
+    cv::internal::WriteStructContext ws(fs, objname, CV_NODE_SEQ + CV_NODE_FLOW);
+
+    int i, n = (int)matches.size();
+    for( i = 0; i < n; i++ )
+    {
+        const DMatch& m = matches[i];
+        cv::write(fs, m.queryIdx);
+        cv::write(fs, m.trainIdx);
+        cv::write(fs, m.imgIdx);
+        cv::write(fs, m.distance);
+    }
+}
+
+void read(const FileNode& node, std::vector<DMatch>& matches)
+{
+    matches.resize(0);
+    FileNodeIterator it = node.begin(), it_end = node.end();
+    for( ; it != it_end; )
+    {
+        DMatch m;
+        it >> m.queryIdx >> m.trainIdx >> m.imgIdx >> m.distance;
+        matches.push_back(m);
+    }
+}
+
+
 int FileNode::type() const { return !node ? NONE : (node->tag & TYPE_MASK); }
 bool FileNode::isNamed() const { return !node ? false : (node->tag & NAMED) != 0; }
 
index ec71e5a..8f66648 100644 (file)
@@ -543,3 +543,13 @@ TEST( Features2d_DescriptorMatcher_FlannBased, regression )
                                   DescriptorMatcher::create("FlannBased"), 0.04f );
     test.safe_run();
 }
+
+TEST( Features2d_DMatch, read_write )
+{
+    FileStorage fs(".xml", FileStorage::WRITE + FileStorage::MEMORY);
+    vector<DMatch> matches;
+    matches.push_back(DMatch(1,2,3,4.5f));
+    fs << "Match" << matches;
+    String str = fs.releaseAndGetString();
+    ASSERT_NE( strstr(str.c_str(), "4.5"), (char*)0 );
+}