如何使用文件存储从 xml 文件中读取矢量<vector<Point3f>>

Posted

技术标签:

【中文标题】如何使用文件存储从 xml 文件中读取矢量<vector<Point3f>>【英文标题】:How to read vector<vector<Point3f> > from xml file with filestorage 【发布时间】:2015-12-20 15:57:55 【问题描述】:

我想知道是否可以使用 cv::FileStorage 类从 xml 文件中加载 Point2f 向量的向量。

这是我尝试保存的内容:

filestorage  << "ObjPoints" << "";
for (int i = 0; i < objPoints.size(); ++i)

    Mat outMat(objPoints[i]);
    filestorage << "ObjPoints_" + IntToString(i) << outMat;

filestorage << "";

这是用于加载的:

FileNode k = n["ObjPoints"];
int i = 0;
for (FileNodeIterator it = k.begin(); it!=k.end(); ++it)

    Mat inMat;
    k["ObjPoints_" + IntToString(i)] >> inMat;
    vector<Point3f> tmp = Mat_<Point3f>(inMat);
    ++i;
    objPoints.push_back(tmp);

其中 objPoints 是一个向量> 和 IntToString 定义如下:

string IntToString(int number)

  stringstream ss;
  ss << number;
  return ss.str();

谁能指出我正确的方向?谢谢。

【问题讨论】:

【参考方案1】:

您可以使用FileNodes 对每个向量和每个点进行迭代。展示比解释容易:

#include <opencv2\opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;

int main()

    
        // Write

        vector<vector<Point3f>> v
              1, 0, 0 ,  1, 0, 1 ,  1, 0, 2  ,
              2, 0, 0  ,
              3, 0, 0 ,  3, 0, 1  ,
        ;


        FileStorage fs("test.xml", FileStorage::WRITE);
        fs << "data" << "[";
        for (int i = 0; i < v.size(); ++i)
        
            // Write each vector
            fs << "[:";
            for (int j = 0; j < v[i].size(); ++j)
            
                // Write each point
                fs << "[:" << v[i][j].x << v[i][j].y << v[i][j].z << "]";  // Or use: fs << v[i][j];
            
            fs << "]"; // close vector
        
        fs << "]"; // close data
    


    // Read

    vector<vector<Point3f>> v;

    FileStorage fs("test.xml", FileStorage::READ);

    FileNode data = fs["data"];
    for (FileNodeIterator itData = data.begin(); itData != data.end(); ++itData)
    
        // Read each vector
        vector<Point3f> vv;

        FileNode pts = *itData;
        for (FileNodeIterator itPts = pts.begin(); itPts != pts.end(); ++itPts)
        
            // Read each point
            FileNode pt = *itPts;

            Point3f point;
            FileNodeIterator itPt = pt.begin();
            point.x = *itPt; ++itPt;
            point.y = *itPt; ++itPt;
            point.z = *itPt;

            vv.push_back(point);
        
        v.push_back(vv);
    

    return 0;

您的 XML 将如下所示:

<?xml version="1.0"?>
<opencv_storage>
<data>
  <_><_>
      1. 0. 0.</_>
    <_>
      1. 0. 1.</_>
    <_>
      1. 0. 2.</_></_>
  <_><_>
      2. 0. 0.</_></_>
  <_><_>
      3. 0. 0.</_>
    <_>
      3. 0. 1.</_></_></data>
</opencv_storage>

或在 YAML 中,如:

%YAML:1.0
data:
   - [ [ 1., 0., 0. ], [ 1., 0., 1. ], [ 1., 0., 2. ] ]
   - [ [ 2., 0., 0. ] ]
   - [ [ 3., 0., 0. ], [ 3., 0., 1. ] ]

【讨论】:

以上是关于如何使用文件存储从 xml 文件中读取矢量<vector<Point3f>>的主要内容,如果未能解决你的问题,请参考以下文章

尝试从文件中读取矢量时出错

如何使用 .NET 3.5 从 XML 文件中读取处理指令

c ++如何使用boost xml解析器读取XML并存储在地图中

请问如何从数据库中读取一个存储过程并把查询结果生成一个xml文件(c#)

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中

如何使用 c# 读取此代码覆盖率 xml 文件报告