在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它很棒且有用)