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
78struct PointPairs : public IPointPairs
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{
127 ICPMethod method = ICPMethod::PointToPlane;
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
155 ICPMode icpMode = ICPMode::AnyRigidXf;
156
159
162 int iterLimit = 10;
163
166 int badIterStopCount = 3;
167
170 float exitVal = 0;
171
174 bool mutualClosest = false;
175};
176
178MRMESH_API size_t deactivateFarPairs( IPointPairs& pairs, float maxDistSq );
179
181MRMESH_API void updatePointPairs( PointPairs& pairs,
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 );
217 MRMESH_API void setFarDistFactor(const float factor);
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
241 MRMESH_API AffineXf3f autoSelectFloatXf();
242
244 MRMESH_API void updatePointPairs();
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
281 ICPExitType resultType_{ ICPExitType::NotStarted };
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
Definition MRBitSet.h:24
size_type size() const noexcept
Definition MRBitSet.h:54
Definition MRICP.h:189
Definition MRMeshOrPoints.h:21
Definition MRPointToPlaneAligningTransform.h:20
MRMESH_API NumSum getSumSqDistToPoint(const IPointPairs &pairs, std::optional< double > inaccuracy={})
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
size_t getNumSamples() const
returns status info string
Definition MRICP.h:251
Vector3f fixedRotationAxis
Additional parameter for ICPMode::OrthogonalAxis and ICPMode::FixedAxis transformation groups.
Definition MRICP.h:158
virtual size_t size() const =0
MRMESH_API void setCosineLimit(const float cos)
Vector3f srcNorm
normal in source point after transforming in world space
Definition MRICP.h:25
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
MRMESH_API NumSum getSumSqDistToPlane(const IPointPairs &pairs, std::optional< double > inaccuracy={})
const ICPProperties & getParams() const
Definition MRICP.h:246
MRMESH_API 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...
MRMESH_API AffineXf3f calculateTransformation()
IPointPairs(const IPointPairs &)=default
void setParams(const ICPProperties &prop)
tune algorithm params before run calculateTransformation()
Definition MRICP.h:213
MRMESH_API void sampleRefPoints(float samplingVoxelSize)
MRMESH_API void setFltSamples(const VertBitSet &fltSamples)
select pairs with origin samples on floating object
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
MRMESH_API size_t getNumActivePairs(const IPointPairs &pairs)
computes the number of active pairs
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
MRMESH_API void setFloatXf(const AffineXf3f &fltXf)
sets to-world transformation for the floating object
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
MRMESH_API std::string getICPStatusInfo(int iterations, ICPExitType exitType)
returns status info string
MRMESH_API void setRefSamples(const VertBitSet &refSamples)
select pairs with origin samples on reference object
MRMESH_API void sampleFltPoints(float samplingVoxelSize)
Vector3f tgtNorm
normal in the target point after transforming in world space
Definition MRICP.h:31
MRMESH_API void setBadIterCount(const int iter)
float getMeanSqDistToPoint(const IPointPairs &pairs)
computes root-mean-square deviation between points
Definition MRICP.h:111
IPointPairs(IPointPairs &&) noexcept=default
std::vector< PointPair > vec
vector of all point pairs both active and not
Definition MRICP.h:83
MRMESH_API void updatePointPairs()
recompute point pairs after manual change of transformations or parameters
BitSet active
whether corresponding pair from vec must be considered during minimization
Definition MRICP.h:75
MRMESH_API void setXfs(const AffineXf3f &fltXf, const AffineXf3f &refXf)
sets to-world transformations both for floating and reference objects
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
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:13
ICPExitType
types of exit conditions in calculation
Definition MRICPEnums.h:32
MRMESH_API ICP(const MeshOrPointsXf &flt, const MeshOrPointsXf &ref, const VertBitSet &fltSamples={}, const VertBitSet &refSamples={})
float weight
weight of the pair (to prioritize over other pairs)
Definition MRICP.h:37
MRMESH_API float getMeanSqDistToPlane() const
computes root-mean-square deviation from points to target planes
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
MRMESH_API 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)
MRMESH_API float getMeanSqDistToPoint() const
computes root-mean-square deviation between points
MRMESH_API ICP(const MeshOrPointsXf &flt, const MeshOrPointsXf &ref, float samplingVoxelSize)
MRMESH_API std::string getStatusInfo() const
bool tgtOnBd
true if if the closest point on target is located on the boundary (only for meshes)
Definition MRICP.h:56
MRMESH_API size_t deactivateFarPairs(IPointPairs &pairs, float maxDistSq)
reset active bit if pair distance is further than maxDistSq
MRMESH_API ICP(const MeshOrPoints &flt, const MeshOrPoints &ref, const AffineXf3f &fltXf, const AffineXf3f &refXf, float samplingVoxelSize)
Definition MRICP.h:208
virtual ICPPairData & operator[](size_t idx) override
Definition MRICP.h:81
MRMESH_API AffineXf3f autoSelectFloatXf()
MRMESH_API void setDistanceLimit(const float dist)
Vector3f srcPoint
coordinates of the source point after transforming in world space
Definition MRICP.h:22
MRMESH_API void setFarDistFactor(const float factor)
int num
Definition MRICP.h:94
float distSq
squared distance between source and target points
Definition MRICP.h:34
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