15void writePOD(std::ofstream& ofs,
const T& value) {
16 ofs.write(
reinterpret_cast<const char*
>(&value),
sizeof(T));
20void readPOD(std::ifstream& ifs, T& value) {
21 ifs.read(
reinterpret_cast<char*
>(&value),
sizeof(T));
25void writeVector(std::ofstream& ofs,
const std::vector<T>& vec) {
26 size_t size = vec.size();
29 ofs.write(
reinterpret_cast<const char*
>(vec.data()),
static_cast<std::streamsize
>(size *
sizeof(T)));
34void readVector(std::ifstream& ifs, std::vector<T>& vec) {
39 ifs.read(
reinterpret_cast<char*
>(vec.data()),
static_cast<std::streamsize
>(size *
sizeof(T)));
44 size_t size = str.size();
47 ofs.write(str.data(),
static_cast<std::streamsize
>(size));
56 ifs.read(&str[0],
static_cast<std::streamsize
>(size));
61void writeVector2D(std::ofstream& ofs,
const std::vector<std::vector<T>>& vec) {
62 size_t outer_size = vec.size();
64 for (
const auto& inner : vec) {
70void readVector2D(std::ifstream& ifs, std::vector<std::vector<T>>& vec) {
73 vec.resize(outer_size);
74 for (
auto& inner : vec) {
105 for (
const auto& row : calib.
DLT_paths) {
106 size_t cols = row.size();
108 for (
const auto& path : row) {
117 size_t param_cols = row.size();
119 for (
const auto& params : row) {
134 for (
auto& path : row) {
146 row.resize(param_cols);
147 for (
auto& params : row) {
158 size_t cols = row.size();
160 for (
const auto& model : row) {
169 size_t cols = row.size();
171 for (
const auto& path : row) {
177void writeStringMap(std::ofstream& ofs,
const std::map<std::string, std::string>& map) {
178 size_t size = map.size();
180 for (
const auto& [key, value] : map) {
195 for (
auto& model : row) {
208 for (
auto& path : row) {
214void readStringMap(std::ifstream& ifs, std::map<std::string, std::string>& map) {
218 for (
size_t i = 0; i < size; ++i) {
219 std::string key, value;
228 std::ofstream ofs(filepath, std::ios::binary);
229 if (!ofs.is_open()) {
230 throw std::runtime_error(
"Failed to open file for writing: " + filepath);
234 uint32_t magic = 0x44494333;
235 uint32_t version = 1;
243 size_t num_frames =
Points3D.size();
262 uint8_t has_dic2dinfo = 0;
263 uint8_t has_allpairs = 0;
268 throw std::runtime_error(
"Error writing binary data to: " + filepath);
272 LOG_DEBUG <<
"DIC3Dcombined saved to binary: " << filepath;
276 std::ifstream ifs(filepath, std::ios::binary);
277 if (!ifs.is_open()) {
278 throw std::runtime_error(
"Failed to open file for reading: " + filepath);
282 uint32_t magic, version;
285 if (magic != 0x44494333) {
286 throw std::runtime_error(
"Invalid file format (magic number mismatch): " + filepath);
289 throw std::runtime_error(
"Unsupported file version: " + std::to_string(version));
300 combined.
Points3D.resize(num_frames);
301 for (
auto& pts : combined.
Points3D) {
317 uint8_t has_dic2dinfo, has_allpairs;
322 throw std::runtime_error(
"Error reading binary data from: " + filepath);
326 LOG_DEBUG <<
"DIC3Dcombined loaded from binary: " << filepath;
328 <<
", Points: " << (combined.
Points3D.empty() ? 0 : combined.
Points3D[0].x.size())
329 <<
", Faces: " << (combined.
Faces.size() / 3);
Lightweight, dependency-free logging facility for CPPxDIC.
DataSerializer - Abstract base class for format-agnostic DIC data I/O.
void readVector(std::ifstream &ifs, std::vector< T > &vec)
void writePoints3D(std::ofstream &ofs, const Point3DFrame &pts)
void writeDistortionData(std::ofstream &ofs, const DistortionData &dist)
void readDispData(std::ifstream &ifs, DispData &disp)
void writeDispData(std::ofstream &ofs, const DispData &disp)
void readPoints3D(std::ifstream &ifs, Point3DFrame &pts)
void writeStringMap(std::ofstream &ofs, const std::map< std::string, std::string > &map)
void writeVector(std::ofstream &ofs, const std::vector< T > &vec)
void readCalibrationData(std::ifstream &ifs, CalibrationData &calib)
void writeVector2D(std::ofstream &ofs, const std::vector< std::vector< T > > &vec)
void readVector2D(std::ifstream &ifs, std::vector< std::vector< T > > &vec)
void readPOD(std::ifstream &ifs, T &value)
void writeCalibrationData(std::ofstream &ofs, const CalibrationData &calib)
void writePOD(std::ofstream &ofs, const T &value)
void writeString(std::ofstream &ofs, const std::string &str)
void readString(std::ifstream &ifs, std::string &str)
void readDistortionData(std::ifstream &ifs, DistortionData &dist)
void readStringMap(std::ifstream &ifs, std::map< std::string, std::string > &map)
std::vector< std::vector< std::string > > DLT_paths
std::vector< std::vector< std::vector< double > > > DLT_params
DIC 3D Combined Results Equivalent to MATLAB's DIC3Dcombined This represents stitched results from mu...
std::vector< int > FacePairInds
DistortionData distortion
std::vector< int > PointPairInds
std::vector< Point3DFrame > Points3D
std::vector< int > pairIndices
std::vector< double > FaceColors
std::vector< std::vector< double > > FaceCorrComb
static DIC3Dcombined loadBinary(const std::string &filepath)
std::vector< std::vector< double > > corrComb
void saveBinary(const std::string &filepath) const
CalibrationData calibration
std::vector< std::vector< double > > FaceCentroids
std::vector< std::vector< double > > DispVec
std::vector< std::vector< double > > DispMgn
std::vector< std::vector< std::string > > distortion_models
std::vector< std::vector< std::string > > distortion_paths