在创建OpenCV的XML文件 [英] Creating an XML file in OpenCV

查看:160
本文介绍了在创建OpenCV的XML文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个XML文件,但是当我尝试读它在我得到一个重复键错误。当我打开XML文件,我注意到,没有被嵌套,并处理一切,因为它是自己单独的节点。我不知道是否有办法正确地创建XML文件,并可以通过它来解析为好。下面我已经列入我的code编写的XML文件出来,我的XML输出​​,以及我希望它是。

I have created an XML file, but when I try to read it in I get an error about a duplicate key. When I opened the XML file I noticed that nothing was nested and everything was treated as it's own individual node. I was wondering if there was a way to properly create the XML file and be able to parse through it as well. Below I have included my code for writing an XML file out, my XML output, and what I would like it to be.

XML code:

// 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 Output:

<?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>

感谢

推荐答案

可以使嵌入另一个节点中的一个节点。
像这样做(用{和}):

You can embedd a node inside another node. Do it like this (using "{" and "}" ):

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的XML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆