困惑,關於OpenCV中把多個結構體變量存入XML中的問題。

 最近做個小項目,涉及到OPENCV中XML的操作問題,現在目標是將多個結構體對象存入XML文件中(類似於往SQL Server表寫入多條記錄),並且希望將結構體屬性名稱同時保存。有兩種常見方式:CV_NODE_SEQ和CV_NODE_MAP。比較常見的例子是寫入一個配置信息,保存的是一個結構體對象,更復雜的例子就沒有了。現在的問題如下:

      1)將多個結構體變量保存;

      2)程序運行時,讀入該文件內容,在內存中構建一個結構體的vector<>對象,用於保存各個結構體變量。

      從相關例子中,可以看出如果保存SEQ類型,似乎也可以,但是如果一次讀入所有結構體變量呢?(按名稱讀取當然沒問題,現在問題讀之前就不知有哪些名稱)。

     請高手指教!

真是高興,好像找到了答案。下面是轉帖的,多謝作者。

OpenCV Write XML File of Facial Feature 
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);
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章