29
#ifndef OPENCV_FLANN_SAVING_H_
30
#define OPENCV_FLANN_SAVING_H_
40
#ifdef FLANN_SIGNATURE_
41
#undef FLANN_SIGNATURE_
43
#define FLANN_SIGNATURE_ "FLANN_INDEX"
51
struct
Datatype<char> {
static
flann_datatype_t type() {
return
FLANN_INT8; } };
53
struct
Datatype<short> {
static
flann_datatype_t type() {
return
FLANN_INT16; } };
55
struct
Datatype<int> {
static
flann_datatype_t type() {
return
FLANN_INT32; } };
57
struct
Datatype<unsigned char> {
static
flann_datatype_t type() {
return
FLANN_UINT8; } };
59
struct
Datatype<unsigned short> {
static
flann_datatype_t type() {
return
FLANN_UINT16; } };
61
struct
Datatype<unsigned int> {
static
flann_datatype_t type() {
return
FLANN_UINT32; } };
63
struct
Datatype<float> {
static
flann_datatype_t type() {
return
FLANN_FLOAT32; } };
65
struct
Datatype<double> {
static
flann_datatype_t type() {
return
FLANN_FLOAT64; } };
75
flann_datatype_t data_type;
76
flann_algorithm_t index_type;
87
template<
typename
Distance>
88
void
save_header(FILE* stream,
const
NNIndex<Distance>& index)
91
memset(header.signature, 0,
sizeof(header.signature));
92
strcpy(header.signature, FLANN_SIGNATURE_);
93
memset(header.version, 0,
sizeof(header.version));
94
strcpy(header.version, FLANN_VERSION_);
95
header.data_type = Datatype<typename Distance::ElementType>::type();
96
header.index_type = index.getType();
97
header.rows = index.size();
98
header.cols = index.veclen();
100
std::fwrite(&header,
sizeof(header),1,stream);
109
inline
IndexHeader load_header(FILE* stream)
112
size_t
read_size = fread(&header,
sizeof(header),1,stream);
114
if
(read_size!=(
size_t)1) {
115
FLANN_THROW(cv::Error::StsError,
"Invalid index file, cannot read");
118
if
(strcmp(header.signature,FLANN_SIGNATURE_)!=0) {
119
FLANN_THROW(cv::Error::StsError,
"Invalid index file, wrong signature");
128
void
save_value(FILE* stream,
const
T& value,
size_t
count = 1)
130
fwrite(&value,
sizeof(value),count, stream);
134
void
save_value(FILE* stream,
const
cvflann::Matrix<T>& value)
136
fwrite(&value,
sizeof(value),1, stream);
137
fwrite(value.data,
sizeof(T),value.rows*value.cols, stream);
141
void
save_value(FILE* stream,
const
std::vector<T>& value)
143
size_t
size = value.size();
144
fwrite(&size,
sizeof(
size_t), 1, stream);
145
fwrite(&value[0],
sizeof(T), size, stream);
149
void
load_value(FILE* stream, T& value,
size_t
count = 1)
151
size_t
read_cnt = fread(&value,
sizeof(value), count, stream);
152
if
(read_cnt != count) {
153
FLANN_THROW(cv::Error::StsParseError,
"Cannot read from file");
158
void
load_value(FILE* stream, cvflann::Matrix<T>& value)
160
size_t
read_cnt = fread(&value,
sizeof(value), 1, stream);
162
FLANN_THROW(cv::Error::StsParseError,
"Cannot read from file");
164
value.data =
new
T[value.rows*value.cols];
165
read_cnt = fread(value.data,
sizeof(T), value.rows*value.cols, stream);
166
if
(read_cnt != (
size_t)(value.rows*value.cols)) {
167
FLANN_THROW(cv::Error::StsParseError,
"Cannot read from file");
173
void
load_value(FILE* stream, std::vector<T>& value)
176
size_t
read_cnt = fread(&size,
sizeof(
size_t), 1, stream);
178
FLANN_THROW(cv::Error::StsError,
"Cannot read from file");
181
read_cnt = fread(&value[0],
sizeof(T), size, stream);
182
if
(read_cnt != size) {
183
FLANN_THROW(cv::Error::StsError,
"Cannot read from file");