我创建了一个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" << vImages[i]->GetWidth();
fs << "Height" << vImages[i]->GetHeight();
fs << "Keypoint_Size" << (int)vImages[i]->GetKeyPoints().size();
for(int j = 0; j < vImages[i]->GetKeyPoints().size(); j++)
{
char szSize[256];
fs << "Angle" << vImages[i]->GetKeyPoints()[j].angle;
fs << "Class" << vImages[i]->GetKeyPoints()[j].class_id;
fs << "Octave" << vImages[i]->GetKeyPoints()[j].octave;
fs << "Pt_X" << vImages[i]->GetKeyPoints()[j].pt.x;
fs << "Pt_Y" << vImages[i]->GetKeyPoints()[j].pt.y;
fs << "Response" << vImages[i]->GetKeyPoints()[j].response;
fs << "Size" << vImages[i]->GetKeyPoints()[j].size;
}
fs << "Descriptors" << vImages[i]->GetDescriptors();
}
fs.release();
}
XML输出:
<?xml version="1.0"?>
<opencv_storage>
<Total_Images>1</Total_Images>
<Node>image_0</Node>
<Width>500</Width>
<Height>266</Height>
<Keypoint_Size>268</Keypoint_Size>
<Angle>8.7332672119140625e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.7401049804687500e+002</Pt_X>
<Pt_Y>6.5084960937500000e+001</Pt_Y>
<Response>0.</Response>
<Size>1.1386331558227539e+001</Size>
<Angle>9.3859291076660156e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.7674386596679687e+002</Pt_X>
<Pt_Y>6.4983604431152344e+001</Pt_Y>
<Response>0.</Response>
<Size>1.2262072563171387e+001</Size>
<Angle>9.8604904174804688e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.1859683990478516e+002</Pt_X>
<Pt_Y>6.6855834960937500e+001</Pt_Y>
<Response>0.</Response>
<Size>1.1112688064575195e+001</Size>
...
预期产出
<?xml version="1.0"?>
<opencv_storage>
<Total_Images>1</Total_Images>
<Node>image_0
<Width>500</Width>
<Height>266</Height>
<Keypoint_Size>268</Keypoint_Size>
<KeyPoint>
<Angle>8.7332672119140625e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.7401049804687500e+002</Pt_X>
<Pt_Y>6.5084960937500000e+001</Pt_Y>
<Response>0.</Response>
<Size>1.1386331558227539e+001</Size>
</KeyPoint>
<KeyPoint>
<Angle>9.3859291076660156e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.7674386596679687e+002</Pt_X>
<Pt_Y>6.4983604431152344e+001</Pt_Y>
<Response>0.</Response>
<Size>1.2262072563171387e+001</Size>
</KeyPoint>
<KeyPoint>
<Angle>9.8604904174804688e+001</Angle>
<Class>0</Class>
<Octave>-1</Octave>
<Pt_X>1.1859683990478516e+002</Pt_X>
<Pt_Y>6.6855834960937500e+001</Pt_Y>
<Response>0.</Response>
<Size>1.1112688064575195e+001</Size>
</KeyPoint>
...
</Node>
由于
答案 0 :(得分:2)
您可以在另一个节点内嵌入一个节点。 这样做(使用“{”和“}”):
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;
答案 1 :(得分:1)
实际上我们可以在opencv / modules / core / src / persistence.cpp第711行看到“Duplicated key”错误 关键似乎与你的xml文件中的节点名称有关:一旦你有许多同名的节点如下,它将有重复的密钥。即使你没有阅读但只是打开这个文件,它会发生那么,只需修改你的节点名称,如何添加索引“node_1”?
<opencv_storage>
<mynodes>
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
...
<node>10</node>
</mynodes>
答案 2 :(得分:0)
你也可以尝试使用更加简洁易懂的JSON
答案 3 :(得分:0)
文件存储不是为这种类型的使用而设计的,但是你可以使用XML解析器/写入器,最简单,最快速和最时尚的是Xerces-C。 You can download it here
实际上,filestorage对象用于存储简单的数据,例如从一个运行时到另一个运行时的校准......据我所知,没有办法在彼此之间构建节点......
于连
编辑:
从MAT读取数据
for(int i=0;i<img.rows;i++) {
unsigned char* row = img.data + i * img.step;
for(int j=0;j<img.cols;j++) {
unsigned char* channB = (row + 3*j);
unsigned char* channG = (row + 3*j + 1);
unsigned char* channR = (row + 3*j + 2);
}
}
使用XERCES-C
写但是,让我告诉你,我认为OpenCV对你的例子来说已经足够了,yuor数据是否在彼此相邻的节点中是一个大问题?我会尝试找到一种更简单的方法,让我想一想,我会在这里回复(但是,你仍然可以尝试Xerces-C它很棒且有用)