大家知道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这四种类型的序列化。