opencv 读写xml文件

    技术2022-05-20  61

    自己整理的,使用OPENCV读写XML文件的数组,不是很完善,欢迎拍砖!

    //将图片存为xml文件程序: #include <iostream> #include <string> #include <vector> using namespace std; #include <highgui.h> #include "cxcore.h" struct CatInfo {  string Title;  int TotalCnt; } ; void my_opencv_xml_write(void);

    int main() {  struct CatInfo Cats[3];//类别数组   Cats[0].Title= "S01";   Cats[0].TotalCnt=10;   Cats[1].Title= "S02";   Cats[1].TotalCnt=20;    Cats[2].Title= "S03";   Cats[2].TotalCnt=30;

       CvFileStorage* fs = cvOpenFileStorage( "upimg_matched_points.xml", 0, CV_STORAGE_WRITE );    if(!fs)    {     return -1;    }    cvStartWriteStruct(fs, "CatInfo", CV_NODE_MAP);//对应于 读取时父节点的子节点    char SN[256];//序号  int max = 3;//类别数组元素个数

     for(int i=0; i<max; i++)  {   sprintf(SN, "%d", i);   char CatType[256] = "CatInfo";//初始化   char* Key = strcat(CatType, SN);//拼接关键字,以免重复

      cvStartWriteStruct(fs, Key, CV_NODE_MAP, Cats[i].Title.c_str());//子节点的子节点,参数2:【不能重名】    cvWriteString(fs, "Title", Cats[i].Title.c_str());   cvWriteInt(fs, "TotalCnt", Cats[i].TotalCnt);   cvEndWriteStruct(fs);  }    cvEndWriteStruct(fs);

       cvReleaseFileStorage(&fs);

      /*文件内容  <?xml version="1.0"?>  <opencv_storage>  <CatInfo>    <CTitle1 type_id="S01">   <Title>S01</Title>   <TotalCnt>10</TotalCnt>    </CTitle1>    <CTitle2 type_id="S02">   <Title>S02</Title>   <TotalCnt>20</TotalCnt>    </CTitle2>  </CatInfo>  </opencv_storage>  */    CvSeq* seq; //节点序列    CvSeqReader reader;//阅读器       fs = cvOpenFileStorage( "upimg_matched_points.xml", 0, CV_STORAGE_READ );//打开文件    CvFileNode* data1 = cvGetRootFileNode( fs, 0);//读出<opencv_storage>节点    CvFileNode* data = cvGetFileNodeByName( fs, data1, "CatInfo" );//读出父节点的子节点    seq = data->data.seq;//读出子节点内所含节点列表    cvStartReadSeq( seq, &reader, 0 );//将阅读器与节点序列头部关联       vector<CatInfo> CatList;  int ElemCnt = seq->header_size/seq->elem_size;//列表元素个数

       for(i = 0; i < ElemCnt; i++)//如何判断reader指向了最后一个节点???    {        //获取阅读器所指节点     CvFileNode *pt=(CvFileNode*)reader.ptr;

        CatInfo newCat;     newCat.Title = cvReadStringByName(fs, pt, "Title", "unknown");        newCat.TotalCnt = cvReadIntByName(fs, pt, "TotalCnt", 0);

      //附加新节点     CatList.push_back(newCat);

        //移动到下一个节点。elem_size类似于结构体大小,移动步长。        CV_NEXT_SEQ_ELEM(seq->elem_size, reader);    }

       cvReleaseFileStorage(&fs);

       return 0; }

    ///下面转发一个函数,有点复杂,留着以后用///

    //有关写入复杂内容的函数例子 void my_opencv_xml_write(void) {  char pID[] = "0001";  int featureCount = 10;  // 具体数据  int _record[]={30000,4200,50090};  //创建文件存储对象  CvFileStorage *fs=cvOpenFileStorage("test.xml",0,CV_STORAGE_WRITE);

     // 写注释  cvWriteComment(fs,"Person Feature Analysis NO.0001",1);  // 开始写结构,类型是图map,也就是有名字的无序节点集合  cvStartWriteStruct(fs, "Person", CV_NODE_MAP, pID , cvAttrList(NULL,NULL));  //{   //1   cvWriteComment(fs,"Face Feature NO.001",1);   // 开始写结构,类型是图map,也就是有名字的无序节点集合   cvStartWriteStruct(fs, "Face_Feature", CV_NODE_MAP, "001", cvAttrList(NULL,NULL)); //  {    //注释Properties    cvWriteComment(fs,"MAPTYPE Properties",1);    // 开始写结构,类型是图map,也就是有名字的无序节点集合    cvStartWriteStruct(fs, "Properties", CV_NODE_MAP, NULL, cvAttrList(NULL,NULL));    // 注释    cvWriteComment(fs,"MAPType, name, age",0);    // 姓名    cvWriteString(fs,"name","liuyue", 0);    // 年龄    cvWriteInt(fs,"age",18);    // 特征值    cvWriteInt(fs,"feature_count",featureCount);    // 结束Properties    cvEndWriteStruct(fs);  // }  // {    // 注释Feature    cvWriteComment(fs,"SEQType Feature",1);    // 开始写结构,类型是序列sequence,无名字的有序节点集合    cvStartWriteStruct(fs,"Feature",CV_NODE_SEQ, NULL, cvAttrList(NULL,NULL));    // 前3条记录    cvWriteRawData(fs,_record,3,"i");    // 第4条记录,注意无名字    cvWriteInt(fs,0,6100);    // 结束Feature    cvEndWriteStruct(fs);  // }   // 结束1   cvEndWriteStruct(fs); // } // {   //2   cvWriteComment(fs,"Face Feature NO.002",1);   // 开始写结构,类型是图map,也就是有名字的无序节点集合   cvStartWriteStruct(fs, "Face_Feature", CV_NODE_MAP, "002", cvAttrList(NULL,NULL)); //  {    //注释Properties    cvWriteComment(fs,"MAPTYPE Properties",1);    // 开始写结构,类型是图map,也就是有名字的无序节点集合    cvStartWriteStruct(fs, "Properties", CV_NODE_MAP, NULL, cvAttrList(NULL,NULL));    // 注释    cvWriteComment(fs,"MAPType, name, age",0);    // 姓名    cvWriteString(fs,"name","liuyue", 0);    // 年龄    cvWriteInt(fs,"age",18);

       // 特征值    cvWriteInt(fs,"feature_count",featureCount);    // 结束Properties    cvEndWriteStruct(fs); //  } //  {    // 注释Feature    cvWriteComment(fs,"SEQType Feature",1);    // 开始写结构,类型是序列sequence,无名字的有序节点集合    cvStartWriteStruct(fs,"Feature",CV_NODE_SEQ, NULL, cvAttrList(NULL,NULL));    // 前3条记录    cvWriteRawData(fs,_record,3,"i");    // 第4条记录,注意无名字    cvWriteInt(fs,0,6100);    // 结束Feature    cvEndWriteStruct(fs); //  }   // 结束2   cvEndWriteStruct(fs); // }

     // 结束  cvEndWriteStruct(fs);  // 释放文件存储对象  cvReleaseFileStorage(&fs); }


    最新回复(0)