MeshLib C++ Docs
Loading...
Searching...
No Matches
MRICP.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRPch/MRBindingMacros.h"
4#include "MRICPEnums.h"
5#include "MRMeshOrPoints.h"
6#include "MRMatrix3.h"
7#include "MRId.h"
8#include "MRConstants.h"
9#include "MRAffineXf.h"
10#include "MRBitSet.h"
11#include <cfloat>
12
13namespace MR
14{
17
18
20{
22 Vector3f srcPoint;
23
25 Vector3f srcNorm;
26
28 Vector3f tgtPoint;
29
31 Vector3f tgtNorm;
32
34 float distSq = 0.f;
35
37 float weight = 1.f;
38
39 friend bool operator == ( const ICPPairData&, const ICPPairData& ) = default;
40};
41
43struct PointPair : public ICPPairData
44{
46 VertId srcVertId;
47
51
53 float normalsAngleCos = 1.f;
54
56 bool tgtOnBd = false;
57
58 friend bool operator == ( const PointPair&, const PointPair& ) = default;
59};
60
63{
65 IPointPairs() = default;
66 IPointPairs( const IPointPairs& ) = default;
67 IPointPairs& operator=( const IPointPairs& ) = default;
68 IPointPairs( IPointPairs&& ) noexcept = default;
69 IPointPairs& operator=( IPointPairs&& ) noexcept = default;
70 virtual ~IPointPairs() = default;
71
72 virtual const ICPPairData& operator[]( size_t ) const = 0;
73 virtual ICPPairData& operator[]( size_t ) = 0;
74 virtual size_t size() const = 0;
76};
77
79{
80 virtual const ICPPairData& operator[]( size_t idx ) const override { return vec[idx]; }
81 virtual ICPPairData& operator[]( size_t idx ) override { return vec[idx]; }
82 virtual size_t size() const override { return vec.size(); }
83 std::vector<PointPair> vec;
84};
85
87[[nodiscard]] inline size_t getNumSamples( const IPointPairs& pairs ) { return pairs.active.size(); }
88
90[[nodiscard]] MRMESH_API size_t getNumActivePairs( const IPointPairs& pairs );
91
92struct NumSum
93{
94 int num = 0;
95 double sum = 0;
96
97 friend NumSum operator + ( const NumSum & a, const NumSum & b ) { return { a.num + b.num, a.sum + b.sum }; }
98
99 [[nodiscard]] float rootMeanSqF() const { return ( num <= 0 ) ? FLT_MAX : (float)std::sqrt( sum / num ); }
100};
101
104[[nodiscard]] MRMESH_API NumSum getSumSqDistToPoint( const IPointPairs& pairs, std::optional<double> inaccuracy = {} );
105
108[[nodiscard]] MRMESH_API NumSum getSumSqDistToPlane( const IPointPairs& pairs, std::optional<double> inaccuracy = {});
109
111[[nodiscard]] inline float getMeanSqDistToPoint( const IPointPairs& pairs ) { return getSumSqDistToPoint( pairs ).rootMeanSqF(); }
112
114[[nodiscard]] inline float getMeanSqDistToPlane( const IPointPairs& pairs ) { return getSumSqDistToPlane( pairs ).rootMeanSqF(); }
115
117[[nodiscard]] MRMESH_API std::string getICPStatusInfo( int iterations, ICPExitType exitType );
118
120[[nodiscard]] MRMESH_API AffineXf3d getAligningXf( const PointToPlaneAligningTransform & p2pl,
121 ICPMode mode, float angleLimit, float scaleLimit, const Vector3f & fixedRotationAxis );
122
125{
128
131 float p2plAngleLimit = PI_F / 6.0f;
132
135 float p2plScaleLimit = 2;
136
140 float cosThreshold = 0.7f;
141
145 float distThresholdSq = 1.f;
146
151 float farDistFactor = 3.f;
152
156
159
162 int iterLimit = 10;
163
167
170 float exitVal = 0;
171
174 bool mutualClosest = false;
175};
176
178MRMESH_API size_t deactivateFarPairs( IPointPairs& pairs, float maxDistSq );
179
182 const MeshOrPointsXf& src, const MeshOrPointsXf& tgt,
183 float cosThreshold, float distThresholdSq, bool mutualClosest );
184
188class [[nodiscard]] ICP
189{
190public:
198 ICP( const MeshOrPoints& flt, const MeshOrPoints& ref, const AffineXf3f& fltXf, const AffineXf3f& refXf,
199 const VertBitSet& fltSamples = {}, const VertBitSet& refSamples = {} ) : ICP( { flt, fltXf }, { ref, refXf }, fltSamples, refSamples ) {}
200 MRMESH_API ICP( const MeshOrPointsXf& flt, const MeshOrPointsXf& ref, const VertBitSet& fltSamples = {}, const VertBitSet& refSamples = {} );
201
208 MRMESH_API ICP( const MeshOrPoints& flt, const MeshOrPoints& ref, const AffineXf3f& fltXf, const AffineXf3f& refXf,
209 float samplingVoxelSize ) : ICP( { flt, fltXf }, { ref, refXf }, samplingVoxelSize ) {}
210 MRMESH_API ICP( const MeshOrPointsXf& flt, const MeshOrPointsXf& ref, float samplingVoxelSize );
211
213 void setParams(const ICPProperties& prop) { prop_ = prop; }
214 MRMESH_API void setCosineLimit(const float cos);
215 MRMESH_API void setDistanceLimit( const float dist );
216 MRMESH_API void setBadIterCount( const int iter );
218
220 MRMESH_API void setFltSamples( const VertBitSet& fltSamples );
221 MRMESH_API void sampleFltPoints( float samplingVoxelSize );
222
224 MRMESH_API void setRefSamples( const VertBitSet& refSamples );
225 MRMESH_API void sampleRefPoints( float samplingVoxelSize );
226
228 void samplePoints( float samplingVoxelSize ) { sampleFltPoints( samplingVoxelSize ); sampleRefPoints( samplingVoxelSize ); }
229
230 [[deprecated]] MR_BIND_IGNORE void recomputeBitSet( float fltSamplingVoxelSize ) { sampleFltPoints( fltSamplingVoxelSize ); }
231
233 MRMESH_API void setXfs( const AffineXf3f& fltXf, const AffineXf3f& refXf );
234
236 MRMESH_API void setFloatXf( const AffineXf3f& fltXf );
237
242
245
246 [[nodiscard]] const ICPProperties& getParams() const { return prop_; }
247
248 [[nodiscard]] MRMESH_API std::string getStatusInfo() const;
249
251 [[nodiscard]] size_t getNumSamples() const { return MR::getNumSamples( flt2refPairs_ ) + MR::getNumSamples( ref2fltPairs_ ); }
252
254 [[nodiscard]] size_t getNumActivePairs() const { return MR::getNumActivePairs( flt2refPairs_ ) + MR::getNumActivePairs( ref2fltPairs_ ); }
255
257 [[nodiscard]] MRMESH_API float getMeanSqDistToPoint() const;
258
260 [[nodiscard]] MRMESH_API float getMeanSqDistToPlane() const;
261
263 [[nodiscard]] const PointPairs & getFlt2RefPairs() const { return flt2refPairs_; }
264
266 [[nodiscard]] const PointPairs & getRef2FltPairs() const { return ref2fltPairs_; }
267
270 [[nodiscard]] MRMESH_API AffineXf3f calculateTransformation();
271
272private:
273 MeshOrPointsXf flt_;
274 MeshOrPointsXf ref_;
275
276 ICPProperties prop_;
277
278 PointPairs flt2refPairs_;
279 PointPairs ref2fltPairs_;
280
282
284 void deactivatefarDistPairs_();
285
286 int iter_ = 0;
287 bool p2ptIter_();
288 bool p2plIter_();
289
290 void calcGen_( float (ICP::*dist)() const, bool (ICP::*iter)() );
291 void calcP2Pt_();
292 void calcP2Pl_();
293 void calcCombined_();
294};
295
296}
constexpr A operator+(A a)
Operators.
Definition MRImGuiVectorOperators.h:97
#define MRMESH_API
Definition MRMeshFwd.h:80
Definition MRBitSet.h:69
size_type size() const noexcept
Definition MRBitSet.h:99
Definition MRICP.h:189
Definition MRMeshOrPoints.h:21
Definition MRPointToPlaneAligningTransform.h:20
void setRefSamples(const VertBitSet &refSamples)
select pairs with origin samples on reference object
friend bool operator==(const ICPPairData &, const ICPPairData &)=default
float normalsAngleCos
cosine between normals in source and target points
Definition MRICP.h:53
VertId srcVertId
id of the source point
Definition MRICP.h:46
float cosThreshold
Definition MRICP.h:140
size_t getNumSamples() const
returns status info string
Definition MRICP.h:251
struct
Definition MRMeshFwd.h:204
ICP(const MeshOrPointsXf &flt, const MeshOrPointsXf &ref, const VertBitSet &fltSamples={}, const VertBitSet &refSamples={})
Vector3f fixedRotationAxis
Additional parameter for ICPMode::OrthogonalAxis and ICPMode::FixedAxis transformation groups.
Definition MRICP.h:158
virtual size_t size() const =0
bool mutualClosest
[distance]
Definition MRICP.h:174
NumSum getSumSqDistToPoint(const IPointPairs &pairs, std::optional< double > inaccuracy={})
int badIterStopCount
Definition MRICP.h:166
Vector3f srcNorm
normal in source point after transforming in world space
Definition MRICP.h:25
size_t getNumActivePairs(const IPointPairs &pairs)
computes the number of active pairs
float getMeanSqDistToPlane(const IPointPairs &pairs)
computes root-mean-square deviation from points to target planes
Definition MRICP.h:114
ICPMode
The group of transformations, each with its own degrees of freedom.
Definition MRICPEnums.h:23
const ICPProperties & getParams() const
Definition MRICP.h:246
IPointPairs(const IPointPairs &)=default
void setParams(const ICPProperties &prop)
tune algorithm params before run calculateTransformation()
Definition MRICP.h:213
float distThresholdSq
in [-1,1]
Definition MRICP.h:145
std::string getStatusInfo() const
int iterLimit
Definition MRICP.h:162
void updatePointPairs(PointPairs &pairs, const MeshOrPointsXf &src, const MeshOrPointsXf &tgt, float cosThreshold, float distThresholdSq, bool mutualClosest)
in each pair updates the target data and performs basic filtering (activation)
void setFloatXf(const AffineXf3f &fltXf)
sets to-world transformation for the floating object
void setCosineLimit(const float cos)
void samplePoints(float samplingVoxelSize)
select pairs with origin samples on both objects
Definition MRICP.h:228
virtual size_t size() const override
Definition MRICP.h:82
Vector3f tgtPoint
coordinates of the closest point on target after transforming in world space
Definition MRICP.h:28
const PointPairs & getRef2FltPairs() const
returns current pairs formed from samples on reference object and projections on floating object
Definition MRICP.h:266
friend bool operator==(const PointPair &, const PointPair &)=default
const PointPairs & getFlt2RefPairs() const
returns current pairs formed from samples on floating object and projections on reference object
Definition MRICP.h:263
size_t getNumActivePairs() const
computes the number of active point pairs
Definition MRICP.h:254
size_t getNumSamples(const IPointPairs &pairs)
returns the number of samples able to form pairs
Definition MRICP.h:87
float rootMeanSqF() const
Definition MRICP.h:99
VertId tgtCloseVert
Definition MRICP.h:50
void setFarDistFactor(const float factor)
ICPMode icpMode
dimensionless
Definition MRICP.h:155
ICP(const MeshOrPoints &flt, const MeshOrPoints &ref, const AffineXf3f &fltXf, const AffineXf3f &refXf, float samplingVoxelSize)
Definition MRICP.h:208
void sampleFltPoints(float samplingVoxelSize)
Vector3f tgtNorm
normal in the target point after transforming in world space
Definition MRICP.h:31
void setBadIterCount(const int iter)
float getMeanSqDistToPoint(const IPointPairs &pairs)
computes root-mean-square deviation between points
Definition MRICP.h:111
std::string getICPStatusInfo(int iterations, ICPExitType exitType)
returns status info string
size_t deactivateFarPairs(IPointPairs &pairs, float maxDistSq)
reset active bit if pair distance is further than maxDistSq
IPointPairs(IPointPairs &&) noexcept=default
float farDistFactor
[distance^2]
Definition MRICP.h:151
std::vector< PointPair > vec
vector of all point pairs both active and not
Definition MRICP.h:83
void setFltSamples(const VertBitSet &fltSamples)
select pairs with origin samples on floating object
ICPMethod method
The method how to update transformation from point pairs, see description of each option in ICPMethod...
Definition MRICP.h:127
BitSet active
whether corresponding pair from vec must be considered during minimization
Definition MRICP.h:75
AffineXf3d getAligningXf(const PointToPlaneAligningTransform &p2pl, ICPMode mode, float angleLimit, float scaleLimit, const Vector3f &fixedRotationAxis)
given prepared (p2pl) object, finds the best transformation from it of given type with given limitati...
virtual const ICPPairData & operator[](size_t idx) const override
Definition MRICP.h:80
IPointPairs & operator=(const IPointPairs &)=default
MR_BIND_IGNORE void recomputeBitSet(float fltSamplingVoxelSize)
Definition MRICP.h:230
ICP(const MeshOrPoints &flt, const MeshOrPoints &ref, const AffineXf3f &fltXf, const AffineXf3f &refXf, const VertBitSet &fltSamples={}, const VertBitSet &refSamples={})
Definition MRICP.h:198
void setXfs(const AffineXf3f &fltXf, const AffineXf3f &refXf)
sets to-world transformations both for floating and reference objects
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:13
ICPExitType
types of exit conditions in calculation
Definition MRICPEnums.h:32
float weight
weight of the pair (to prioritize over other pairs)
Definition MRICP.h:37
NumSum getSumSqDistToPlane(const IPointPairs &pairs, std::optional< double > inaccuracy={})
ICP(const MeshOrPointsXf &flt, const MeshOrPointsXf &ref, float samplingVoxelSize)
void setDistanceLimit(const float dist)
double sum
Definition MRICP.h:95
IPointPairs()=default
required to declare explicitly to avoid warnings
ICPMethod
The method how to update transformation from point pairs.
Definition MRICPEnums.h:9
float getMeanSqDistToPoint() const
computes root-mean-square deviation between points
float getMeanSqDistToPlane() const
computes root-mean-square deviation from points to target planes
void sampleRefPoints(float samplingVoxelSize)
AffineXf3f autoSelectFloatXf()
bool tgtOnBd
true if if the closest point on target is located on the boundary (only for meshes)
Definition MRICP.h:56
float p2plAngleLimit
Definition MRICP.h:131
virtual ICPPairData & operator[](size_t idx) override
Definition MRICP.h:81
Vector3f srcPoint
coordinates of the source point after transforming in world space
Definition MRICP.h:22
AffineXf3f calculateTransformation()
float p2plScaleLimit
[radians]
Definition MRICP.h:135
void updatePointPairs()
recompute point pairs after manual change of transformations or parameters
int num
Definition MRICP.h:94
float distSq
squared distance between source and target points
Definition MRICP.h:34
float exitVal
Definition MRICP.h:170
@ AnyRigidXf
rigid body transformation (6 degrees of freedom)
Definition MRICPEnums.h:25
@ factor
Definition MRUnitInfo.h:51
@ NotStarted
Definition MRICPEnums.h:33
@ PointToPlane
Definition MRICPEnums.h:13
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRICP.h:20
parameters of ICP algorithm
Definition MRICP.h:125
Simple interface for pairs holder.
Definition MRICP.h:63
an object and its transformation to global space with other objects
Definition MRMeshOrPoints.h:109
Definition MRICP.h:93
Stores a pair of points: one samples on the source and the closest to it on the target.
Definition MRICP.h:44
Definition MRICP.h:79