最近做個小項目,涉及到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);
}