大家知道FLANN库提供关于ANN问题的多种算法,包括KDTREE,KMEANS,HIERARCHICAL_CLUSTERING,等多种算法,我们要将我们训练好的模型存储,就需要一个文件头来存储我们模型的基本信息,saving.h这个头文件就定义了这样一个结构体:
struct IndexHeader;
成员变量:
char signature[16];
char version[16];
flann_datatype_t data_type;
flann_algorithm_t index_type;
flann_distance_t distance_type;
size_t rows;
size_t cols;
version存储的是本FLANN版本信息,我使用的是1.8.4
data_type 存储的是模型使用的数据类型。
index_type 指明的是模型使用的算法。
distance_type 指明该算法所用的距离类型(比如L1,L2等)。
rows 指明模型points的数量。
cols 指明points的大小。
成员方法:
IndexHeader();
serialize(Archive & ar);
IndexHeader()为构造函数,主要初始化version,和signature。
serialize是序列化本检索头,当Archive类型是LoadArchive时,将LoadArchive中stream对应的文件中的检索头,加载到本检索头中。当Archive类型是SaveArchive是,将本检索头存储到SaveArchive对应的文件中。LOAD或SAVE的顺序为,signature,version,data_type ,index_type,rows,cols。
不熟悉ARCHIVE类的,可参考Archive
方法
void save_header(FILE * stream, const Index & index);
该方法是根据index(我们也可以称作模型)来创建相应的检索头,并将检索头存储带stream对应的文件中。
方法
inline IndexHeader load_header(FILE * stream);
该方法是从文件流stream中,创建返回一个检索头。
namespace serialization
{
ENUM_SERIALIZER(flann_algorithm_t);
ENUM_SERIALIZER(flann_centers_init_t);
ENUM_SERIALIZER(flann_log_level_t);
ENUM_SERIALIZER(flann_datatype_t);
}
这四个define,是定义对flann_algorithm_t,flann_centers_init_t,flann_log_level_t,flann_datatype_t这四种类型的序列化。