如何使用文件存储从 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 是一个向量
string IntToString(int number)
stringstream ss;
ss << number;
return ss.str();
谁能指出我正确的方向?谢谢。
【问题讨论】:
【参考方案1】:您可以使用FileNode
s 对每个向量和每个点进行迭代。展示比解释容易:
#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>>的主要内容,如果未能解决你的问题,请参考以下文章
c ++如何使用boost xml解析器读取XML并存储在地图中
请问如何从数据库中读取一个存储过程并把查询结果生成一个xml文件(c#)