user_3849
user_3849

Reputation: 106

FileStorage::WRITE .xml tag on opencv

I've been trying to write a nested .xml file with a vector<vector<Point>> data type in OpenCV (on C++). However, I have always one extra tag created within the loops:

string filename = "test.xml";
FileStorage fs(filename, FileStorage::WRITE);
fs << "data" << "[";


    for (int i = 0; i < myvector.size(); ++i)
    {
         //Write each vector
        fs << "{:" << "vector" << "[:";

        for (int j = 0; j < myvector[i].size(); ++j)
        {
            fs << "{:" << "point";
             //Write each point
            fs << "{" << "x" << myvector[i][j].x << "y" << myvector[i][j].y << "}";  
            fs  << "}"; // close point
        }
        fs << "]" << "}"; // close vector
    }
    fs << "]"; // close data
    fs.release();

The result is:

    <?xml version="1.0"?>
<opencv_storage>
<data>
  <_><vector><_><point>
          <x>162</x>
          <y>30</y></point></_>
      <_><point>
          <x>162</x>
          <y>31</y></point></_>
      <_><point>
          <x>161</x>
          <y>32</y></point></_>
      </vector></_>
  </data>
</opencv_storage>

while the expected output should be (also need to change tag name within the loop)

<?xml version="1.0"?>
<opencv_storage>
  <data>
    <vector>
      <point1>
          <x>162</x>
          <y>30</y>
        </point1>
        <<point2>
          <x>162</x>
          <y>31</y>
        </point2>
        <point3>
          <x>161</x>
          <y>32</y>
        </point3>
      </vector>
    </data>
</opencv_storage>

Any idea about what may cause this problem? Thanks!

Upvotes: 1

Views: 767

Answers (1)

GStav
GStav

Reputation: 1166

There are brackets for both sequences ("[") and mappings ("{"). You can try this:

string filename = "test.xml";
FileStorage fs(filename, FileStorage::WRITE);
fs << "data" << "{";
for (int i = 0; i < myvector.size(); ++i)
    {
         //Write each vector
        fs << "vector" << "{";

        for (int j = 0; j < myvector[i].size(); ++j)
        {
            fs << "point" << "{";
             //Write each point
            fs  << "x" << myvector[i][j].x << "y" << myvector[i][j].y ;  
            fs  << "}"; // close point
        }
        fs << "}"; // close vector
    }
    fs << "}"; // close data
fs.release();

More info here

Upvotes: 2

Related Questions