opencv 读写xml文件

来源:互联网 发布:python range(2,1) 编辑:程序博客网 时间:2024/06/06 08:32

自己整理的,使用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);
}

原创粉丝点击