42 #include <visp3/core/vpConfig.h>
51 #include <visp3/core/vpColor.h>
58 #if VISP_CXX_STANDARD > VISP_CXX_STANDARD_98
62 static inline unsigned long vp_mz_crc32(
unsigned long crc,
const unsigned char *ptr,
size_t buf_len)
64 static const unsigned int s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
65 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };
66 unsigned int crcu32 = (
unsigned int)crc;
70 unsigned char b = *ptr++;
71 crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)];
72 crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)];
84 NpyArray(
const std::vector<size_t> &_shape,
size_t _word_size,
bool _fortran_order) :
98 return reinterpret_cast<T *
>(&(*data_holder)[0]);
104 return reinterpret_cast<T *
>(&(*data_holder)[0]);
110 const T *p = data<T>();
111 return std::vector<T>(p, p+
num_vals);
126 using npz_t = std::map<std::string, NpyArray>;
131 VISP_EXPORT
char map_type(
const std::type_info &t);
132 template<
typename T> std::vector<char>
create_npy_header(
const std::vector<size_t> &shape);
133 VISP_EXPORT
void parse_npy_header(FILE *fp,
size_t &word_size, std::vector<size_t> &shape,
bool &fortran_order);
134 VISP_EXPORT
void parse_npy_header(
unsigned char *buffer,
size_t &word_size, std::vector<size_t> &shape,
bool &fortran_order);
135 VISP_EXPORT
void parse_zip_footer(FILE *fp, uint16_t &nrecs,
size_t &global_header_size,
size_t &global_header_offset);
139 template<
typename T> std::vector<char> &
operator+=(std::vector<char> &lhs,
const T rhs)
142 for (
size_t byte = 0;
byte <
sizeof(T); ++byte) {
143 char val = *((
char *)&rhs+
byte);
149 template<>
inline std::vector<char> &
operator+=(std::vector<char> &lhs,
const std::string rhs)
151 lhs.insert(lhs.end(), rhs.begin(), rhs.end());
155 template<>
inline std::vector<char> &
operator+=(std::vector<char> &lhs,
const char *rhs)
158 size_t len = strlen(rhs);
160 for (
size_t byte = 0;
byte < len; ++byte) {
161 lhs.push_back(rhs[
byte]);
176 template<
typename T>
void npy_save(std::string fname,
const T *data,
const std::vector<size_t> shape, std::string mode =
"w")
179 std::vector<size_t> true_data_shape;
181 if (mode ==
"a") fp = fopen(fname.c_str(),
"r+b");
188 assert(!fortran_order);
190 if (word_size !=
sizeof(T)) {
191 std::cout<<
"libnpy error: "<<fname<<
" has word size "<<word_size<<
" but npy_save appending data sized "<<
sizeof(T)<<
"\n";
192 assert(word_size ==
sizeof(T));
194 if (true_data_shape.size() != shape.size()) {
195 std::cout<<
"libnpy error: npy_save attempting to append misdimensioned data to "<<fname<<
"\n";
196 assert(true_data_shape.size() != shape.size());
199 for (
size_t i = 1; i < shape.size(); ++i) {
200 if (shape[i] != true_data_shape[i]) {
201 std::cout<<
"libnpy error: npy_save attempting to append misshaped data to "<<fname<<
"\n";
202 assert(shape[i] == true_data_shape[i]);
205 true_data_shape[0] += shape[0];
208 fp = fopen(fname.c_str(),
"wb");
209 true_data_shape = shape;
212 std::vector<char> header = create_npy_header<T>(true_data_shape);
213 size_t nels = std::accumulate(shape.begin(), shape.end(), 1, std::multiplies<size_t>());
215 fseek(fp, 0, SEEK_SET);
216 fwrite(&header[0],
sizeof(
char), header.size(), fp);
217 fseek(fp, 0, SEEK_END);
218 fwrite(data,
sizeof(T), nels, fp);
233 template<
typename T>
void npz_save(std::string zipname, std::string fname,
const T *data,
const std::vector<size_t> &shape, std::string mode =
"w")
241 size_t global_header_offset = 0;
242 std::vector<char> global_header;
244 if (mode ==
"a") fp = fopen(zipname.c_str(),
"r+b");
251 size_t global_header_size;
253 fseek(fp,
static_cast<long>(global_header_offset), SEEK_SET);
254 global_header.resize(global_header_size);
255 size_t res = fread(&global_header[0],
sizeof(
char), global_header_size, fp);
256 if (res != global_header_size) {
257 throw std::runtime_error(
"npz_save: header read error while adding to existing zip");
259 fseek(fp,
static_cast<long>(global_header_offset), SEEK_SET);
262 fp = fopen(zipname.c_str(),
"wb");
265 std::vector<char> npy_header = create_npy_header<T>(shape);
267 size_t nels = std::accumulate(shape.begin(), shape.end(), 1, std::multiplies<size_t>());
268 size_t nbytes = nels*
sizeof(T) + npy_header.size();
271 uint32_t crc =
vp_mz_crc32(0L, (uint8_t *)&npy_header[0], npy_header.size());
272 crc =
vp_mz_crc32(crc, (uint8_t *)data, nels*
sizeof(T));
275 std::vector<char> local_header;
276 local_header +=
"PK";
277 local_header += (uint16_t)0x0403;
278 local_header += (uint16_t)20;
279 local_header += (uint16_t)0;
280 local_header += (uint16_t)0;
281 local_header += (uint16_t)0;
282 local_header += (uint16_t)0;
283 local_header += (uint32_t)crc;
284 local_header += (uint32_t)nbytes;
285 local_header += (uint32_t)nbytes;
286 local_header += (uint16_t)fname.size();
287 local_header += (uint16_t)0;
288 local_header += fname;
291 global_header +=
"PK";
292 global_header += (uint16_t)0x0201;
293 global_header += (uint16_t)20;
294 global_header.insert(global_header.end(), local_header.begin()+4, local_header.begin()+30);
295 global_header += (uint16_t)0;
296 global_header += (uint16_t)0;
297 global_header += (uint16_t)0;
298 global_header += (uint32_t)0;
299 global_header += (uint32_t)global_header_offset;
300 global_header += fname;
303 std::vector<char> footer;
305 footer += (uint16_t)0x0605;
306 footer += (uint16_t)0;
307 footer += (uint16_t)0;
308 footer += (uint16_t)(nrecs+1);
309 footer += (uint16_t)(nrecs+1);
310 footer += (uint32_t)global_header.size();
311 footer += (uint32_t)(global_header_offset + nbytes + local_header.size());
312 footer += (uint16_t)0;
315 fwrite(&local_header[0],
sizeof(
char), local_header.size(), fp);
316 fwrite(&npy_header[0],
sizeof(
char), npy_header.size(), fp);
317 fwrite(data,
sizeof(T), nels, fp);
318 fwrite(&global_header[0],
sizeof(
char), global_header.size(), fp);
319 fwrite(&footer[0],
sizeof(
char), footer.size(), fp);
332 template<
typename T>
void npy_save(std::string fname,
const std::vector<T> data, std::string mode =
"w")
334 std::vector<size_t> shape;
335 shape.push_back(data.size());
336 npy_save(fname, &data[0], shape, mode);
349 template<
typename T>
void npz_save(std::string zipname, std::string fname,
const std::vector<T> data, std::string mode =
"w")
351 std::vector<size_t> shape;
352 shape.push_back(data.size());
353 npz_save(zipname, fname, &data[0], shape, mode);
358 std::vector<char> dict;
359 dict +=
"{'descr': '";
362 dict += std::to_string(
sizeof(T));
363 dict +=
"', 'fortran_order': False, 'shape': (";
364 dict += std::to_string(shape[0]);
365 for (
size_t i = 1; i < shape.size(); ++i) {
367 dict += std::to_string(shape[i]);
369 if (shape.size() == 1) dict +=
",";
372 int remainder = 16 - (10 + dict.size()) % 16;
373 dict.insert(dict.end(), remainder,
' ');
376 std::vector<char> header;
377 header += (char)0x93;
379 header += (char)0x01;
380 header += (char)0x00;
381 header += (uint16_t)dict.size();
382 header.insert(header.end(), dict.begin(), dict.end());
494 static const std::string &getBuildInformation();
495 static std::string getTempPath();
496 static void getUserName(std::string &username);
497 static std::string getUserName();
498 static std::string getenv(
const std::string &env);
499 static std::string getViSPImagesDataPath();
500 static void getVersion(
const std::string &version,
unsigned int &major,
unsigned int &minor,
unsigned int &patch);
501 static bool checkDirectory(
const std::string &dirname);
502 static bool checkFifo(
const std::string &filename);
503 static bool checkFilename(
const std::string &filename);
504 static bool copy(
const std::string &src,
const std::string &dst);
506 static void makeDirectory(
const std::string &dirname);
507 static void makeFifo(
const std::string &dirname);
508 static std::string makeTempDirectory(
const std::string &dirname);
509 static std::string path(
const std::string &pathname);
511 static bool remove(
const std::string &filename);
512 static bool rename(
const std::string &oldfilename,
const std::string &newfilename);
520 static std::string toUpperCase(
const std::string &input);
521 static std::string toLowerCase(
const std::string &input);
522 static std::string getAbsolutePathname(
const std::string &pathname);
523 static std::string getFileExtension(
const std::string &pathname,
bool checkFile =
false);
524 static long getIndex(
const std::string &filename,
const std::string &format);
525 static std::string getName(
const std::string &pathname);
526 static std::string getNameWE(
const std::string &pathname);
527 static std::string getParent(
const std::string &pathname);
528 static std::string createFilePath(
const std::string &parent,
const std::string &child);
529 static bool isAbsolutePathname(
const std::string &pathname);
530 static bool isSamePathname(
const std::string &pathname1,
const std::string &pathname2);
531 static std::pair<std::string, std::string> splitDrive(
const std::string &pathname);
532 static std::vector<std::string> splitChain(
const std::string &chain,
const std::string &sep);
533 static std::vector<std::string> getDirFiles(
const std::string &dirname);
540 static bool loadConfigFile(
const std::string &confFile);
541 static bool readConfigVar(
const std::string &var,
float &value);
542 static bool readConfigVar(
const std::string &var,
double &value);
543 static bool readConfigVar(
const std::string &var,
int &value);
544 static bool readConfigVar(
const std::string &var,
unsigned int &value);
545 static bool readConfigVar(
const std::string &var,
bool &value);
546 static bool readConfigVar(
const std::string &var, std::string &value);
547 static bool readConfigVar(
const std::string &var,
vpColor &value);
548 static bool readConfigVar(
const std::string &var,
vpArray2D<double> &value,
const unsigned int &nCols = 0,
549 const unsigned int &nRows = 0);
552 static void setBaseName(
const std::string &s);
553 static void setBaseDir(
const std::string &dir);
554 static void addNameElement(
const std::string &strTrue,
const bool &cond =
true,
const std::string &strFalse =
"");
555 static void addNameElement(
const std::string &strTrue,
const double &val);
556 static std::string getBaseName();
557 static std::string getFullName();
560 static void saveConfigFile(
const bool &actuallySave =
true);
561 static void createBaseNamePath(
const bool &empty =
false);
564 static void readBinaryValueLE(std::ifstream &file, int16_t &short_value);
565 static void readBinaryValueLE(std::ifstream &file, uint16_t &ushort_value);
566 static void readBinaryValueLE(std::ifstream &file, int32_t &int_value);
567 static void readBinaryValueLE(std::ifstream &file, uint32_t &int_value);
568 static void readBinaryValueLE(std::ifstream &file,
float &float_value);
569 static void readBinaryValueLE(std::ifstream &file,
double &double_value);
571 static void writeBinaryValueLE(std::ofstream &file,
const int16_t short_value);
572 static void writeBinaryValueLE(std::ofstream &file,
const uint16_t ushort_value);
573 static void writeBinaryValueLE(std::ofstream &file,
const int32_t int_value);
574 static void writeBinaryValueLE(std::ofstream &file,
const uint32_t int_value);
575 static void writeBinaryValueLE(std::ofstream &file,
float float_value);
576 static void writeBinaryValueLE(std::ofstream &file,
double double_value);
578 static bool parseBoolean(std::string input);
579 static std::string trim(std::string s);
588 #ifndef DOXYGEN_SHOULD_SKIP_THIS
589 static int mkdir_p(
const std::string &path,
int mode);
Class to define RGB colors available for display functionalities.
VISP_EXPORT char map_type(const std::type_info &t)
std::vector< char > create_npy_header(const std::vector< size_t > &shape)
void npz_save(std::string zipname, std::string fname, const T *data, const std::vector< size_t > &shape, std::string mode="w")
VISP_EXPORT npz_t npz_load(std::string fname)
VISP_EXPORT void parse_zip_footer(FILE *fp, uint16_t &nrecs, size_t &global_header_size, size_t &global_header_offset)
void npy_save(std::string fname, const T *data, const std::vector< size_t > shape, std::string mode="w")
VISP_EXPORT void parse_npy_header(FILE *fp, size_t &word_size, std::vector< size_t > &shape, bool &fortran_order)
std::vector< char > & operator+=(std::vector< char > &lhs, const T rhs)
std::map< std::string, NpyArray > npz_t
VISP_EXPORT NpyArray npy_load(std::string fname)
VISP_EXPORT char BigEndianTest()
static unsigned long vp_mz_crc32(unsigned long crc, const unsigned char *ptr, size_t buf_len)
std::shared_ptr< std::vector< char > > data_holder
std::vector< size_t > shape
std::vector< T > as_vec() const
NpyArray(const std::vector< size_t > &_shape, size_t _word_size, bool _fortran_order)