CortidQCT  1.2.2.52
MeshFitter.h
1 #pragma once
2 
3 #include "MeasurementModel.h"
4 #include "Mesh.h"
5 #include "VoxelVolume.h"
6 
7 #include "Optional.h"
8 #include "propagate_const.h"
9 
10 #include <array>
11 #include <memory>
12 #include <variant>
13 
14 namespace CortidQCT {
15 
16 namespace Internal {
17 struct PrivateStateAccessor;
18 }
19 
20 struct Coordinate3D {
21  enum class Type { absolute, relative };
22 
23  std::array<float, 3> xyz{{0, 0, 0}};
24  Type type{Type::absolute};
25 };
26 
30 class MeshFitter {
31  class Impl;
32 
33 public:
34 #pragma clang diagnostic push
35 #pragma clang diagnostic ignored "-Wpadded"
36 
39  struct Configuration {
40  enum class OriginType { untouched, centered };
41  using Origin = std::variant<OriginType, Coordinate3D>;
42  using ScaleVector = std::array<float, 3>;
43 
44  using RotationVector = std::array<float, 3>;
45 
51  double sigmaE = 5.4;
53  double sigmaS = 2.0;
55  std::size_t maxIterations = 100;
57  std::size_t minNonDecreasing = 10;
59  float decay = 0.9f;
61  bool ignoreExteriorSamples = false;
62 
72  Origin referenceMeshOrigin = OriginType::untouched;
73 
77  ScaleVector referenceMeshScale = {{1.f, 1.f, 1.f}};
78 
84  RotationVector referenceMeshRotation = {{0.f, 0.f, 0.f}};
85 
92  Configuration &loadFromFile(std::string const &filename);
93 
99  inline static Configuration fromFile(std::string const &filename) {
100  return Configuration{}.loadFromFile(filename);
101  }
102 
111  std::array<float, 3> meshTranslation(VoxelVolume const &volume) const;
112  };
113 #pragma clang diagnostic pop
114 
115 #pragma clang diagnostic push
116 #pragma clang diagnostic ignored "-Wpadded"
117 
120  struct Result {
126  std::vector<float> displacementVector;
128  std::vector<float> weights;
130  std::vector<std::array<float, 3>> vertexNormals;
132  std::vector<std::array<float, 3>> volumeSamplingPositions;
134  std::vector<float> volumeSamples;
136  float minDisNorm = std::numeric_limits<float>::max();
138  float logLikelihood = -std::numeric_limits<float>::max();
139 #pragma clang diagnostic push
140 #pragma clang diagnostic ignored "-Wdocumentation-deprecated-sync"
141  // in `deformedMesh` instead. Will be removed in version 2.0.
144  std::vector<float> perVertexLogLikelihood;
145 #pragma clang diagnostic pop
146  float effectiveSigmaS = .0f;
149  std::size_t iteration = 1;
151  bool converged = false;
153  bool success = false;
155  std::size_t nonDecreasing = 0;
156  };
157 
159  struct State : public Result {
160  State() = default;
161  State(State const &);
162  State(State &&) = default;
163  State(Result const &);
164  State(Result &&);
165  ~State();
166  State &operator=(State const &);
167  State &operator=(State &&) = default;
168 
169  private:
170  friend class Impl;
171  friend struct Internal::PrivateStateAccessor;
172  struct HiddenState;
173  using HiddenStatePtr = std::unique_ptr<HiddenState>;
174 
176  HiddenStatePtr hiddenState_;
177  };
178 
179 #pragma clang diagnostic pop
180 
186  Configuration configuration;
188 
190 
195  MeshFitter(Configuration config);
196 
197  ~MeshFitter();
198  MeshFitter(MeshFitter const &);
199  MeshFitter(MeshFitter &&) noexcept;
200  MeshFitter &operator=(MeshFitter const &);
201  MeshFitter &operator=(MeshFitter &&) noexcept;
202 
203  void swap(MeshFitter &rhs) noexcept;
204 
210  inline MeshFitter(std::string const &configFilename)
211  : MeshFitter(Configuration::fromFile(configFilename)) {}
212 
219  Result fit(VoxelVolume const &volume) const;
220 
231  State init(VoxelVolume const &volume) const;
232 
248  void fitOneIteration(State &state) const;
249 
259  void volumeSamplingStep(State &state) const;
260 
270  void optimalDisplacementStep(State &state) const;
271 
282  void optimalDeformationStep(State &state) const;
283 
293  void logLikelihoodStep(State &state) const;
294 
303  void convergenceTestStep(State &state) const;
304 
305 private:
306 #ifndef CORTIDQCT_NO_PROPAGATE_CONST
307  std::propagate_const<std::unique_ptr<Impl>> pImpl_;
308 #else
309  std::unique_ptr<Impl> pImpl_;
310 #endif
311 };
312 
313 } // namespace CortidQCT
Configuration type for MeshFitter.
Definition: MeshFitter.h:39
Name namespace for CortidQCT library.
Definition: CortidQCT.h:23
Mesh< float > deformedMesh
The deformed mesh or nullopt if fitting failed.
Definition: MeshFitter.h:124
std::vector< std::array< float, 3 > > volumeSamplingPositions
Volume sampling positions.
Definition: MeshFitter.h:132
Configuration & loadFromFile(std::string const &filename)
Load the configuration from a file.
Definition: MeshFitterConfiguration.cpp:52
Definition: MeshFitter.h:30
Include file defining the Mesh data type.
std::vector< std::array< float, 3 > > vertexNormals
per-vertex normals
Definition: MeshFitter.h:130
Mesh< float > referenceMesh
The reference mesh.
Definition: MeshFitter.h:122
Type representing a voxel volume.
Definition: VoxelVolume.h:32
std::vector< float > weights
the weght vector
Definition: MeshFitter.h:128
Internal State type.
Definition: MeshFitter.h:159
Type representing the measurement model.
Definition: MeasurementModel.h:33
Definition: MeshFitterHiddenState.h:36
MeshFitter(std::string const &configFilename)
Convenience constructor that reads the configuration from the given configuration file...
Definition: MeshFitter.h:210
Mesh< float > referenceMesh
The reference mesh.
Definition: MeshFitter.h:49
static Configuration fromFile(std::string const &filename)
Convenience initializer to load a configuration from file.
Definition: MeshFitter.h:99
Definition: MeshFitterHiddenState.h:21
Result type.
Definition: MeshFitter.h:120
std::vector< float > volumeSamples
Volume samples.
Definition: MeshFitter.h:134
This header contains the definition of the MeasurementModel type.
This header contains the definition of the VoxelVolume type.
std::vector< float > displacementVector
The displacement vector.
Definition: MeshFitter.h:126
Definition: MeshFitterImpl.h:21
std::vector< float > perVertexLogLikelihood
Per-vertex log likelihood vector (deprecated)
Definition: MeshFitter.h:144
Definition: MeshFitter.h:20
MeasurementModel model
The measurement model.
Definition: MeshFitter.h:47
This header is a wrapper for including optional depending on the supported C++ standard version...