github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/opencv4/include/opencv2/flann/saving.h (about) 1 /*********************************************************************** 2 * Software License Agreement (BSD License) 3 * 4 * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. 5 * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE NNIndexGOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 *************************************************************************/ 28 29 #ifndef OPENCV_FLANN_SAVING_H_ 30 #define OPENCV_FLANN_SAVING_H_ 31 32 //! @cond IGNORED 33 34 #include <cstring> 35 #include <vector> 36 37 #include "general.h" 38 #include "nn_index.h" 39 40 #ifdef FLANN_SIGNATURE_ 41 #undef FLANN_SIGNATURE_ 42 #endif 43 #define FLANN_SIGNATURE_ "FLANN_INDEX" 44 45 namespace cvflann 46 { 47 48 template <typename T> 49 struct Datatype {}; 50 template<> 51 struct Datatype<char> { static flann_datatype_t type() { return FLANN_INT8; } }; 52 template<> 53 struct Datatype<short> { static flann_datatype_t type() { return FLANN_INT16; } }; 54 template<> 55 struct Datatype<int> { static flann_datatype_t type() { return FLANN_INT32; } }; 56 template<> 57 struct Datatype<unsigned char> { static flann_datatype_t type() { return FLANN_UINT8; } }; 58 template<> 59 struct Datatype<unsigned short> { static flann_datatype_t type() { return FLANN_UINT16; } }; 60 template<> 61 struct Datatype<unsigned int> { static flann_datatype_t type() { return FLANN_UINT32; } }; 62 template<> 63 struct Datatype<float> { static flann_datatype_t type() { return FLANN_FLOAT32; } }; 64 template<> 65 struct Datatype<double> { static flann_datatype_t type() { return FLANN_FLOAT64; } }; 66 67 68 /** 69 * Structure representing the index header. 70 */ 71 struct IndexHeader 72 { 73 char signature[16]; 74 char version[16]; 75 flann_datatype_t data_type; 76 flann_algorithm_t index_type; 77 size_t rows; 78 size_t cols; 79 }; 80 81 /** 82 * Saves index header to stream 83 * 84 * @param stream - Stream to save to 85 * @param index - The index to save 86 */ 87 template<typename Distance> 88 void save_header(FILE* stream, const NNIndex<Distance>& index) 89 { 90 IndexHeader header; 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(); 99 100 std::fwrite(&header, sizeof(header),1,stream); 101 } 102 103 104 /** 105 * 106 * @param stream - Stream to load from 107 * @return Index header 108 */ 109 inline IndexHeader load_header(FILE* stream) 110 { 111 IndexHeader header; 112 size_t read_size = fread(&header,sizeof(header),1,stream); 113 114 if (read_size!=(size_t)1) { 115 FLANN_THROW(cv::Error::StsError, "Invalid index file, cannot read"); 116 } 117 118 if (strcmp(header.signature,FLANN_SIGNATURE_)!=0) { 119 FLANN_THROW(cv::Error::StsError, "Invalid index file, wrong signature"); 120 } 121 122 return header; 123 124 } 125 126 127 template<typename T> 128 void save_value(FILE* stream, const T& value, size_t count = 1) 129 { 130 fwrite(&value, sizeof(value),count, stream); 131 } 132 133 template<typename T> 134 void save_value(FILE* stream, const cvflann::Matrix<T>& value) 135 { 136 fwrite(&value, sizeof(value),1, stream); 137 fwrite(value.data, sizeof(T),value.rows*value.cols, stream); 138 } 139 140 template<typename T> 141 void save_value(FILE* stream, const std::vector<T>& value) 142 { 143 size_t size = value.size(); 144 fwrite(&size, sizeof(size_t), 1, stream); 145 fwrite(&value[0], sizeof(T), size, stream); 146 } 147 148 template<typename T> 149 void load_value(FILE* stream, T& value, size_t count = 1) 150 { 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"); 154 } 155 } 156 157 template<typename T> 158 void load_value(FILE* stream, cvflann::Matrix<T>& value) 159 { 160 size_t read_cnt = fread(&value, sizeof(value), 1, stream); 161 if (read_cnt != 1) { 162 FLANN_THROW(cv::Error::StsParseError, "Cannot read from file"); 163 } 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"); 168 } 169 } 170 171 172 template<typename T> 173 void load_value(FILE* stream, std::vector<T>& value) 174 { 175 size_t size; 176 size_t read_cnt = fread(&size, sizeof(size_t), 1, stream); 177 if (read_cnt!=1) { 178 FLANN_THROW(cv::Error::StsError, "Cannot read from file"); 179 } 180 value.resize(size); 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"); 184 } 185 } 186 187 } 188 189 //! @endcond 190 191 #endif /* OPENCV_FLANN_SAVING_H_ */