结构化:数据结构字段含义确定,清晰,可以用二维表结构来逻辑表达
非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性
半结构化:结构化变化很大的数据,无法按结构化方式存储。
XML 是存储半结构化信息公认最好的模式,其Tag 由用户自动定义,除灵活性外,还具有一定的语义知识。
openCV中xml 文件的读写
临时存储结构:
使用CvFileStorage 文件存储结构体进行各种数据的存储,包括用户自定义对象(写成xml或yaml格式文件)。
CvMemStorage
内存存储器结构体是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型。
读写操作:
1. cvStartWriteStruct() 向文件存储结构体中写入数据
原型:
void cvStartWriteStruct( CvFileStorage* fs, const char* name, int struct_flags, const char* type_name=NULL, CvAttrList attributes=cvAttrList());
其中参数int struct_flags 有下列两个值:
CV_NODE_SEQ - 被写入的数据结构为序列结构。这样的数据没有名称。
CV_NODE_MAP - 被写入的数据结构为图表结构。这样的数据含有名称。
这两个标志符必须被指定一个
CV_NODE_FLOW - 这个可选择标识符只能作用于YAML流。被写入的数据结构被看做一个数据流(不是数据块),它更加紧凑,当结构或数组里的数据是标量时,推荐用这个标志。
type_name对象类型名, 即xml 中,<节点 属性=" type_name">, 目前openCV的版本支持的属性为“type_id“。
注:使用完该操作后需要 cvEndWriteStruct(fs);
2. cvWriteRawData()写入基本数据数组
原型:
void cvWriteRawData( CvFileStorage* fs, const void* src, int len, const char* dt );
参数char* dt 取值:
([count]{'u'|'c'|'w'|'s'|'i'|'f'|'d'})..., 这些特性与C语言的类型相似 :
'u' - 8位无符号数。
'c' - 8位符号数。
'w' - 16位无符号数。
's' - 16位符号数。
'i' - 32位符号数。
'f' - 单精度浮点数。
'd' - 双精度浮点数。
'r' - 指针。输入的带符号的低32位整数。 这个类型常被用来存储结构体之间的链接。
count 是可选的,是当前类型的计数器 。 例如, dt='2if' 是指任意的一个数组元素的结构是:2个字节整形数,后面跟一个单精度浮点数。上面的说明与‘iif', '2i1f' 等相同。另外一个例子:dt='u'是指 一个由类型组成的数组, dt='2d'是指由两个双精度浮点数构成的数组。