Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV中创建XML文件_C_Xml_Opencv - Fatal编程技术网

在OpenCV中创建XML文件

在OpenCV中创建XML文件,c,xml,opencv,C,Xml,Opencv,我已经创建了一个XML文件,但是当我试图读入它时,我得到了一个关于重复密钥的错误。当我打开XML文件时,我注意到没有嵌套任何内容,所有内容都被视为它自己的单独节点。我想知道是否有一种方法可以正确地创建XML文件并能够解析它。下面我介绍了编写XML文件的代码、XML输出以及我希望它是什么 XML代码: // Open up the file so that we can write to it cv::FileStorage fs; fs.open(szFileName, cv::FileStor

我已经创建了一个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();
}
//打开文件以便我们可以对其进行写入
cv::文件存储fs;
open(szFileName,cv::FileStorage::WRITE);
//检查我们是否确实创建了该文件
如果(fs.isOpened())
{

fs您还可以尝试使用更快速、更易于解释的JSON

您还可以尝试使用更快速、更易于解释的JSON

文件存储不是为这种类型的使用而设计的,但是您可以使用XML解析器/编写器,最简单、最快速、最时尚的是Xerces-C

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

朱利安

编辑:

从垫子上读取数据


for(int i=0;i文件存储不是为这种类型的使用而设计的,但是您可以使用XML解析器/写入程序,最简单、最快和最流行的是Xerces-C

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

朱利安

编辑:

从垫子上读取数据


for(int i=0;i您可以将一个节点嵌入到另一个节点中。
这样做(使用“{”和“}”):

FileStorage fs;//打开它并检查它是否已打开;

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

FileStorage fs;//打开它并检查它是否已打开;
fs实际上,我们可以在opencv/modules/core/src/persistence.cpp第711行中看到“复制密钥”错误
该键似乎与xml文件中的节点名称有关:一旦您有许多具有相同名称的节点,如下图所示,它将具有重复的键。即使您没有读取但只是打开此文件,也会发生这种情况。因此,只需修改节点名称,添加索引“node_1”如何


1.
2.
3.
4.
...
10

实际上,我们可以在opencv/modules/core/src/persistence.cpp第711行中看到“复制密钥”错误 该键似乎与xml文件中的节点名称有关:一旦您有许多具有相同名称的节点,如下图所示,它将具有重复的键。即使您没有读取但只是打开此文件,也会发生这种情况。因此,只需修改节点名称,添加索引“node_1”如何


1.
2.
3.
4.
...
10

如果我知道cv::Mat结构是如何安排的,我会亲自用二进制文件写出我的数据。太好了,那么你所需要做的就是检查Mat的文档,并写下你想从中保存的所有内容:@karlphillip-我检查了很多次该文档,但它仍然没有向我解释太多。我有一个示例矩阵,它有268行和保存为类型5的128列。我不确定类型5到底是什么,在将其写入二进制格式时,我需要考虑大小并尝试“sizeof(5)”根据
OpenCV-2.3.0/modules/core/include/opencv2/core/types_c.h
,可能不起作用,类型5是
CV_32F
,这意味着数据存储为32位浮点。顺便说一句,由于文档是s*ck,如果你想擅长OpenCV,你需要在OpenCV源代码中轻松搜索内容。如果我知道CV::Mat structu重新安排后,我会亲自用二进制写下我的数据。太好了,那么你所需要做的就是检查Mat的文档,并写下你想保存的所有内容:@karlphillip-我检查了那个文档很多次,但它仍然没有给我解释太多。我有一个示例矩阵,它有268行和128列,保存为类型5。I我不确定类型5到底是什么,在将其写入二进制格式时,我需要考虑大小并尝试“sizeof(5)”根据
OpenCV-2.3.0/modules/core/include/opencv2/core/types_c.h
,可能无法工作,类型5是
CV_32F
,这意味着数据存储为32位浮点。顺便说一句,由于文档是s*ck,如果你想擅长OpenCV,你需要在OpenCV源代码中轻松搜索内容。我真的希望使用OpenCV对于I/O,因为它处理cv::Mat数据,但如果我别无选择,只能获得一个用于XML编写的外部API,我想知道如何写入和读取cv::Mat数据,并能够从中创建数据。这不是一个大问题,它只是返回一个错误,指出在尝试读取数据时存在重复键。我认为e format会引发该错误。我不确定是否必须使用FileNode类并迭代每个节点。如果是这样,我需要找到一个这样做的示例。Jmartel,你错了。文件存储非常适合xml编写。请参阅我关于如何在node中创建节点的回答。我真的希望使用OpenCV进行I/O,因为它处理cv::Mat数据,但如果我别无选择,只能获得一个用于XML编写的外部API,我想知道如何写入和读取cv::Mat数据,并能够从中创建数据。这不是一个大问题,它只是返回一个错误,指出在我尝试读取数据时存在重复键。我认为该格式会引发该错误。N我不确定是否必须使用FileNode类并迭代每个节点。如果是这样,我需要找到一个这样做的示例。Jmartel,你错了。文件存储非常适合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>
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);
    }
}
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_storage>
<mynodes>
    <node>1</node>
    <node>2</node>
    <node>3</node>
    <node>4</node>
    ...
    <node>10</node>
</mynodes>