cvStartWriteStruct()与cvEndWriteStruct()嵌套使用

cvStartWriteStruct()与cvEndWriteStruct()嵌套使用

void cvStartWriteStruct( CvFileStorage* fs, const char* name, int struct_flags, const char* type_name=NULL, CvAttrList attributes=cvAttrList());
fs 初始化文件存储器。 name 被写入的数据结构的名称。在存储器被读取时可以通过名称访问数据结构。 struct_flags 有下列两个值:
CV_NODE_SEQ - 被写入的数据结构为序列结构。这样的数据没有名称。
CV_NODE_MAP - 被写入的数据结构为图表结构。这样的数据含有名称。
这两个标志符必须被指定一个
CV_NODE_FLOW - 这个可选择标识符只能作用于YAML流。被写入的数据结构被看做一个数据流(不是数据块),它更加紧凑,当结构或数组里的数据是标量时,推荐用这个标志。
嵌套使用 存储包含结构体的结构体时需要多次嵌套使用该函数,如果最外面的结构体没有名称,则最外面的cvStartWriteStruct()中stuct_flags可以随便选用;如果含有名称只能选用 CV_NODE_MAP。 例子(《学习opencv》第3章练习8): 代码:
#include 
#include 
#include   

 struct my_struct
	{
		int value;
		CvPoint point;
		CvRect rect;
	};
void write_my_stuct(CvFileStorage* fs,const char* name,my_struct* ms)
	{
		cvStartWriteStruct(fs,"my_struct",CV_NODE_MAP);

		cvWriteInt(fs,"my_struct_value",ms[0].value);
		
		cvStartWriteStruct(fs,"my_struct_point",CV_NODE_SEQ);
		cvWriteInt(fs,0,ms[0].point.x);
		cvWriteInt(fs,0,ms[0].point.x);
		cvEndWriteStruct(fs);

		cvStartWriteStruct(fs,"my_struct_rect",CV_NODE_SEQ);
		cvWriteInt(fs,0,ms[0].rect.x);
		cvWriteInt(fs,0,ms[0].rect.y);
		cvWriteInt(fs,0,ms[0].rect.width);
		cvWriteInt(fs,0,ms[0].rect.height);
		cvEndWriteStruct(fs);

		cvEndWriteStruct(fs);
	}

int main()
{
	my_struct ms;
        ms.value=i;
	ms.point=cvPoint(i,i);
	ms.rect=cvRect(i,i,10,10);
	char* name="cfg.xml";
	CvFileStorage* fs=cvOpenFileStorage(name,0,CV_STORAGE_WRITE);
	write_my_stuct( fs,name,ms);
	cvReleaseFileStorage(&fs);
	return 0;
}
运行结果: cvStartWriteStruct()与cvEndWriteStruct()嵌套使用_第1张图片

你可能感兴趣的:(cvStartWriteStruct()与cvEndWriteStruct()嵌套使用)