在OpenCV中创建XML文件

我创建了一个XML文件,但是当我尝试读取它时,我收到有关重复键的错误。 当我打开XML文件时,我注意到没有嵌套的东西,所有东西都被视为它自己的个别节点。 我想知道是否有办法正确创建XML文件并能够解析它。 下面我已经包含了用于编写XML文件的代码,我的XML输出以及我希望它的内容。

XML代码:

// Open up the file so that we can write to it cv::FileStorage fs; fs.open(szFileName, cv::FileStorage::WRITE); // Check if we actually created the file if(fs.isOpened()) { fs << "Total_Images" << (int)vImages.size(); //cv::write(fs, "Total Images", (int)vImages.size()); for(int i = 0; i < (int)vImages.size(); i++) { char szSize[8]; string szNode; szNode = "image_"; itoa(i, szSize, 10); szNode += szSize; fs << "Node" << szNode; fs << "Width" <GetWidth(); fs << "Height" <GetHeight(); fs << "Keypoint_Size" <GetKeyPoints().size(); for(int j = 0; j GetKeyPoints().size(); j++) { char szSize[256]; fs << "Angle" <GetKeyPoints()[j].angle; fs << "Class" <GetKeyPoints()[j].class_id; fs << "Octave" <GetKeyPoints()[j].octave; fs << "Pt_X" <GetKeyPoints()[j].pt.x; fs << "Pt_Y" <GetKeyPoints()[j].pt.y; fs << "Response" <GetKeyPoints()[j].response; fs << "Size" <GetKeyPoints()[j].size; } fs << "Descriptors" <GetDescriptors(); } fs.release(); } 

XML输出:

   1 image_0 500 266 268 8.7332672119140625e+001 0 -1 1.7401049804687500e+002 6.5084960937500000e+001 0. 1.1386331558227539e+001 9.3859291076660156e+001 0 -1 1.7674386596679687e+002 6.4983604431152344e+001 0. 1.2262072563171387e+001 9.8604904174804688e+001 0 -1 1.1859683990478516e+002 6.6855834960937500e+001 0. 1.1112688064575195e+001 ... 

预期产出

   1 image_0 500 266 268  8.7332672119140625e+001 0 -1 1.7401049804687500e+002 6.5084960937500000e+001 0. 1.1386331558227539e+001   9.3859291076660156e+001 0 -1 1.7674386596679687e+002 6.4983604431152344e+001 0. 1.2262072563171387e+001   9.8604904174804688e+001 0 -1 1.1859683990478516e+002 6.6855834960937500e+001 0. 1.1112688064575195e+001  ...  

谢谢

您可以在另一个节点中嵌入一个节点。 这样做(使用“{”和“}”):

 FileStorage fs; // Open it and check that it is opened; fs << "SimpleData" << 1; fs << "Structure << "{"; fs << "firstField" << 1; fs << "secondField" << 2; fs << "}"; // End of structure node fs << "SimpleData2" << 2; 

实际上我们可以看到opencv / modules / core / src / persistence.cpp第711行中的“Duplicated key”错误。关键似乎与xml文件中的节点名称有关:一旦你有许多同名的节点就像下面,它将有重复的密钥。即使你没有阅读但只是打开这个文件,它会发生。所以,只需修改你的节点名称,如何添加索引“node_1”?

   1 2 3 4 ... 10  

您也可以尝试使用更简洁易懂的JSON

文件存储不是为这种类型的使用而设计的,但是你可以使用XML解析器/写入器,最简单,最快速和最时尚的是Xerces-C。 您可以在这里下载

实际上,filestorage对象用于存储简单的数据,例如从一个运行时到另一个运行时的校准……据我所知,没有办法在彼此之间构建节点…

朱利安,

编辑:

从MAT读取数据

 for(int i=0;i 

用XERCES-C写

  • “DOMPrint”示例显示了如何使用序列化程序在文档中写入...

但是,让我告诉你,我认为OpenCV对你的例子来说已经足够了,yuor数据在彼此相邻的节点中是一个大问题吗? 我会尝试找到一种更简单的方法,让我想一想,我会在这里回复(但是,你仍然可以尝试Xerces-C它很棒且有用)