|
Developer Documentation |
|
Centre for Vision, Speech & Signal Processing |
|
PUBLIC |
BaseRegisC::BaseRegisC(void)
BaseRegisC::BaseRegisC(VectorSetC &,VectorSetC &,const int &,const int &)
BaseRegisC::BaseRegisC(const int &,const int &)
BaseRegisC::~BaseRegisC(void)
BaseRegisC::SetExpectedRT(const RigidTransC &)
BaseRegisC::SetMaxIter(const int &)
BaseRegisC::SetPrediction(const EnumPrediction &)
BaseRegisC::SetRMSThresh(const double &)
BaseRegisC::SetRegWay(const EnumRegWay &)
BaseRegisC::SetRegType(const SceModT &)
BaseRegisC::SetMSECalculation(const EnumMseCalculation &)
BaseRegisC::SetBoundaryCheck(const EnumBoundary &)
BaseRegisC::SetNormalCheck(const EnumAngle &)
BaseRegisC::SetDistanceCheck(const EnumSigmaCheck &)
BaseRegisC::SetHistory(const int &)
BaseRegisC::SaveHistory2Com(const char *,const char *)
BaseRegisC::PerformRegistration(RigidTransC)
BaseRegisC::GetNNPairs(VectorSetC &,VectorSetC &,VectorSetC &,RealSArray1dC &,SArray1dC &,int &)
BaseRegisC::CheckBoundary(const double &)
BaseRegisC::MSE(void)
BaseRegisC::NormAngleCheck(VectorSetC &,VectorSetC &,SArray1dC &)
BaseRegisC::DistanceCheck(const RealSArray1dC &,SArray1dC &)
BaseRegisC::FindNearest(VectorSetC &,VectorSetC &,VectorSetC &,VectorSetC &,SArray1dC &)
BaseRegisC::DoTransformation(void)
BaseRegisC::IterationBreak(const int &)
BaseRegisC::BasicIterate(const int &)
BaseRegisC::AcceleratedIterate(const int &)
BaseRegisC::PrintHeader(void)
BaseRegisC::PrintResults(const int &)
BaseRegisC::FinalResults(void)
BaseRegisC::Savings(void)
BaseRegisC::RigidT_TO_VectorC7(RigidTransC &)
BaseRegisC::VectorC7_TO_RigidT(VectorC &)
BodyRefCounterVC::Copy(void) const
BodyRefCounterVC::operator==(const BodyRefCounterVC &) const
BodyRefCounterVC::operator!=(const BodyRefCounterVC &) const
BodyRefCounterVC::Save(ostream &) const
BodyRefCounterC::AddReference(void)
BodyRefCounterC::RemoveReference(void)
BodyRefCounterC::SetConst(void) const
BodyRefCounterC::SetConst(void)
BodyRefCounterC::IsConst(void) const
BodyRefCounterC::IsNotConst(void) const
BodyRefCounterC::ToBeDeleted(void) const
BodyRefCounterC::ToBeDeletedRemoveIgnoreNoRemove(void)
BodyRefCounterC::ToBeDeletedRemove(void)
BodyRefCounterC::BodyMightBeDeleted(void) const
BodyRefCounterC::IsCountZero(void) const
BodyRefCounterC::BRCPtrCanDeleteObject(void) const
BodyRefCounterC::Count(void) const
BodyRefCounterC::operator=(const BodyRefCounterC &)
BodyRefCounterC::IsValidObject(void) const
BodyRefCounterC::UserBitTest(IntT) const
BodyRefCounterC::UserBitSet(IntT,BooleanT)
BodyRefCounterC::UserBitZero(IntT)
BodyRefCounterC::ReportBRCError(char *)
BodyRefCounterC::Hash(void) const
BodyRefCounterC::SetUndeletable(void)
BodyRefCounterC::ReportInvalidObject(char *) const
RefCounterBaseC::Label(void) const
|
| BaseRegisC
|
| |
| BaseRegisC is an Abstract Base Class, which is reference counted (Big Object) and provides the core operations for doing point set registration.
|
| |
| include | "amma/BaseRegis.hh" |
| User Level: | Default |
| Library: | POLREGIS |
| Example: | cri.cc |
| Section: | 3D Surface.Registration |
| In Scope: | std |
Comments:
BaseRegisC is an Abstract Base Class, which is reference counted (Big Object)
and provides the core operations for doing point set registration.
To avoid an accumulating error, a vector set workMovPointsM is defined which
is initialized as a copy of startMovPointsM. A nearest neighbour search is
performed on the fixed object. The result of this search is stored in the
vector set fixM, which contains all the corresponding nearest neighbour
points to workMovPointsM.
workMovPointsM and fixM will be registered and the transformation of this
single iteration step is stored in rtKM. After each iteration, deltaRtKM is
applied to all previous transformations, so that rtKM represents the
RigidTransC to transform startMovPointsM -> fixM. The next iteration starts
with workMovPointsM = rtKM o startMovPointsM, again nearest neighbour search
and so on.
The returned RigidTransC of BaseRegisC contains the transformation
rtKM o (guess o startMovPointsM) = fixM
To accelerate the time expensive process of iteration, the user may select
prediction (based on Besl & McKay 92), which demands less iterations.
There are further quality improving features that can be switched on and off.
These are Surface Normal Check, Boundary Check and Distance Check.
The user also has the facility of choosing the method to be used to calculate
the Mean Square Error.
When using the trace mode, printouts are given on each iteration step. Some
of the fields are only relevant when using the prediction. Hence there fields
will be blank, indicated by ------.
#i - iteration number
#pts - number of random points on moveable surface
#w - number of weights minus the sum of weights
RMS - RMS value
% 1st - Comparison of the current & very 1st RMS value in %
|Trans| - Translation occured from previous translation
%Tn-1 - Comparison of the last & current total translation value in %
%Texp - Comparison of the expected & current total translation in %
Rotation - Current Rotation in degrees
%Rn-1 - Comparison of the last & current total rotation in %
%Rexp - Comparison of the expected and current rotation in %
NCA - Indicates whether weights were affected by the Normal Angle Check
BCA - Indicates whether weights were affected by the Boundary Check
DCA - Indicates whether weights were affected by the Distance Check
Thek_1 - Angle in 7D space between previous last two registration vectors
Thetak - Angle in 7D space between last two registration vectors
PRP - Prediction is Possible (Good Alignment Between last two
registration vectors)
CDP - Can Do Prediction (Parabola, Line Based or Max Allowable Update)
PUO - Permanent Prediction Update Occured (YES/NO)
MSEk - Value of MSE before attempted prediction update
MSEp - Value of MSE after (temporary/permanent) prediction update
FindNearest returns the vector set fixM containing the closest surface points
to a given set of points workMovPointsM. It also needs an array of weights.
Points that have their weight value less than NearZero will be completely
ignored. Note that the derived class will provide the virtual GetNNPairs()
function, which is required by FindNearest. An error message will be given by
FindNearest if the sum of all weights is zero, the program will then be
terminated since it is then impossible to proceed.
All vector sets that are passed to the constructors must have the same number
of entries i=1...N.
There are various options provided by the constructor and member functions,
which affect results obtained, except the trace option.
Trace
0 : No information is displayed.
1 : All information is displayed; the amount of detail displayed depends
whether the Basic ICP or Accelerated ICP is being used.
Check Boundary
keepBoundaryPoints : Do not modify weight values of boundary points.
discardBoundaryPoints : Boundary point weight values are modified
accordingly to the distance and standard deviation.
Check Normals
noAngleCheck : No normal angle check is performed.
doAngleCheck : A normal angle check is performed and each point's weight is
weight is modified appropriately.
Distance Check
noDistanceCheck : Do not perform distance check.
doDistanceCheck : Perform distance check and modify each point's weight
appropriately.
MSE Calculation
standardMse : Use the standard MSE calculation method.
madEstimator : Use the Median Absolute Deviation Estimator Method.
Parent Classes:
Derived Classes:
Variables:
- int iterationNumberM;
-
Number of iterations for Monte Carlo
- double sigma8SurfaceM;
-
Sigma8_surface for Monte Carlo
- MatrixC covarianceM;
-
Covariance for Monte Carlo
- VectorSetC startMovPointsM;
-
Initial position of moving object points
- VectorSetC startMovNormalsM;
-
Original normals (not transformed)
- int nptsM;
-
Actual number of points, which maybe random
- EnumBoundary boundaryM;
-
Whether to modify boundary point's weights
- const double NearZeroM;
-
Used for equal to zero tests
- VectorSetC fixM;
-
Nearest neighbour points on fixed object
- VectorSetC fixNormalsM;
-
Normal's of NN points on fixed object
- RealSArray1dC fixDistancesM;
-
Distance's between NN points on fixed
object and points with moving object
- VectorSetC workMovPointsM;
-
Points on the moving object
- VectorSetC workMovNormalsM;
-
Normal's of points on moving object
- SArray1dC weightM;
-
Weights associated with the points on the
moving object
- const double NormTheta0M;
-
- const double NormTheta1M;
-
- RigidTransC expectRtM;
-
Expected RT
- int maxIterM;
-
Maximum number of iterations
- double rmsThreshM;
-
RMS error threshold
- double firstRmsM;
-
First_rms error (if trace>0)
- EnumPrediction predictionM;
-
noPrediction : No linear prediction
prediction : Do linear prediction
- BooleanT traceM;
-
Printout
- EnumAngle normalsM;
-
Surface normal check
- EnumMseCalculation mseCalcM;
-
MSE Calculation Type
- EnumSigmaCheck sigmaM;
-
Distances check
Not currently used
- EnumRegWay regWayM;
-
regis : Regis or
pRegis : PRegis to estimate the
transformation
- SceModT regTypeM;
-
scene_scene : scene_scene
model_scene : model_scene
- double mseKM;
-
Current value of MSE (MSE_k)
- double mseK_1M;
-
Previous value of MSE (MSE_k-1)
- double mseK_2M;
-
Previous Previous value of MSE (MSE_k-2)
- double accMseK_1M;
-
Previous Value of MSE after accelerated iteration
- double accMseK_2M;
-
Previous Previous value of MSE after acceleration
- RigidTransC rtKM;
-
Current translation & rotation
- RigidTransC rtK_1M;
-
Previous translation & rotation
- RigidTransC rtK_2M;
-
Previous previous translation & rotation
- double thetaKM;
-
Angle in 7D space between last two registration
vectors
- double thetaK_1M;
-
Angle in 7D space between previous last two
registration vectors
- RigidTransC deltaRtKM;
-
Translation & rotation in one basic iteration
- RigidTransC accRtK_1M;
-
Previous total translation and rotation from the
accelerated ICP algoritm
- int normalAngleAffectedWeightsM;
-
- int boundaryCheckAffectedWeightsM;
-
- int distanceCheckAffectedWeightsM;
-
- int predictionGoodAlignmentM;
-
- int doPredictionUpdateM;
-
Used In Accelerated ICP Also
- double mseBeforePredictionM;
-
- double predictionMseM;
-
- int predictionUpdateOccurredM;
-
- int histM;
-
Indicates whether to store history
- DListC historyM;
-
Holds history information
Methods:
- BaseRegisC(void)
-
Null Constructor
- BaseRegisC(VectorSetC & movpts,VectorSetC & movnmls,const int & npoints = 200,const int & trace = 0)
-
Constructor
| movpts | IN: Points on the the moveable object |
| movnmls | IN: Normals of points on moveable object |
| npoints | IN: Number of points on moveable |
| trace | IN: 1 = Detailed prints & saves data
|
| | 0 = No prints, no savings |
|
Passing moving points & their normals, as well as number of points,
and trace option. The fixed surface is stored within the derived class.
- BaseRegisC(const int & npoints,const int & trace = 0)
-
Constructor
| npoints | IN: Number of points on the moveable object
|
| | (No Default, so as to remove ambiguity |
| | with the null constructor) |
| trace | IN: 1 = Detailed prints & saves data
|
| | 0 = No prints, no savings |
|
Passing number of points and trace option.
The moving points are passed via the derived class.
The fixed surface is stored within the derived class.
- ~BaseRegisC()
-
Destructor
- void SetExpectedRT(const RigidTransC & exp = RigidTransC())
-
Sets the expected Final translation & rotation.
| exp | IN: Expected final Translation and Rotation |
|
This is so that it can be compared with the actual translation and
rotation at the end of the print out. It also allows errors to be
computed.
- void SetMaxIter(const int & iteration = 1000)
-
Maximum number of iterations before terminating the registration.
| iteration | IN: Maximum number of iterations |
|
- void SetPrediction(const EnumPrediction & prediction = noPrediction)
-
Whether to use prediction or basic ICP.
| prediction | IN: noPrediction = No Prediction
|
| | prediction = Perform Prediction |
|
- void SetRMSThresh(const double & ratioThres = 0.99)
-
Set threshold for RMS error.
| ratioThres | IN: ratio threshold |
|
Termination occurs when 2 successive ratios exceed ratioThres.
See IterationBreak() for details.
- void SetRegWay(const EnumRegWay & regWay = regis)
-
Chooses the function which will calculate the transform to move the moveable onto the new nearest neighbours on the fixed surface.
| regWay | IN: regis = Regis
|
| | pRegis = PRegis |
|
THE DEFAULT IS THE ONLY OPTION CURRENTLY USED !!!!
- void SetRegType(const SceModT & regType = scene_scene)
-
Defines the registration type.
| regType | IN: scene_scene = scene_scene
|
| | model_scene = model_scene |
|
THE DEFAULT IS THE ONLY OPTION CURRENTLY USED !!!!
- void SetMSECalculation(const EnumMseCalculation & mseCalc = standardMse)
-
Sets the calculation type for the MSE.
| mseCalc | IN: standardMse = Standard MSE
|
| | madEstimator = Uses the MAD Estimator |
|
- void SetBoundaryCheck(const EnumBoundary & bound = discardBoundaryPoints)
-
Whether to modify weights of NN pairs that are on the boundary of fixed.
| bound | IN: keepBoundaryPoints = Don't modify weight values
|
| | discardBoundaryPoints = Modify weight values accordingly |
|
- void SetNormalCheck(const EnumAngle & normal = noAngleCheck)
-
Whether to modify weights of NN pairs that have significantly different normal values.
| normal | IN: noAngleCheck = Don't do normal angle check
|
| | doAngleCheck = Do normal angle check |
|
- void SetDistanceCheck(const EnumSigmaCheck & sigma = noDistanceCheck)
-
Whether to modify weights of NN pairs that have significantly greater distances between them & the moving object, compared to the rest overall.
| sigma | IN: noDistanceCheck = Don't do distance check
|
| | doDistanceCheck = Do distance check |
|
- void SetHistory(const int & hst = 0)
-
Used to set whether a history of RTs (RigidTransforms) are kept.
| hst | IN: 0 = Do not keep history of RTs
|
| | 1 = Keep a history of each RT obtained |
| | after each iteration |
|
Note: Call this function before PerformRegistration().
- void SaveHistory2Com(const char * comfname,const char * movfname)
-
Uses the history information and creates a .com file.
| comfname | IN: Filename for .com file |
| movfname | IN: Filename of the moveable file |
|
Note: Call this function after you have called
PerformRegistration().
- RigidTransC PerformRegistration(RigidTransC guess)
-
Execute registration with initial guess, return desired RT.
- void GetNNPairs(VectorSetC & fixPts,VectorSetC & workMovPts,VectorSetC & fixNormals,RealSArray1dC & fixDists,SArray1dC<double> & wght,int & boundCheckAffectedWeights)
-
Get Nearest Neighbours.
| fixPts | IN: Fixed points |
| workMovPts | IN: Workable moveable points |
| fixNormals | IN: Normals associated with fixPts |
| fixDists | IN: Distances between NN points on fixed object |
| | and points on moving object |
| wght | I&O: Weights associated with points on moveable |
| boundCheckAffectedWeights | OUT: Whether any weights were |
| | affected by the boundary check |
|
Method of how this is achieved is defined in the derived classes.
- double CheckBoundary(const double & distance)
-
Returns a weight value to modify a point's weight value accordingly to the distance passed associated with the NN Pair, i.e. weight[point] *= return_value.
| distance | IN: Distance between NN Pair |
|
- double MSE()
-
Compute the average mean square error.
Method used depends on calculation type chosen by the user,
determined by the call to SetMSECalculation().
- void NormAngleCheck(VectorSetC & movNormals,VectorSetC & fixNrm,SArray1dC<double> & wght)
-
Check angle between normals and modify weights accordingly.
| movNormals | IN: Normals associated with moveable |
| fixNrm | IN: Normals associated with fixM |
| wght | I&O: Weights associated with points on moveable |
|
- void DistanceCheck(const RealSArray1dC & fixDists,SArray1dC<double> & wght)
-
Checks distance against the standard deviation and modifies the weights accordingly.
| fixDists | IN: Distances between NN Pairs |
| wght | I&O: Weights associated with points on moveable |
|
- void FindNearest(VectorSetC & workMovPts,VectorSetC & workMovNmls,VectorSetC & fixPts,VectorSetC & fixNmls,SArray1dC<double> & wght)
-
Finds nearest neighbours using GetNNPairs().
| workMovPts | IN: Working moveable surface |
| workMovNmls | IN: Normals of working moveable |
| fixPts | OUT: NN on fixed surface. |
| fixNmls | OUT: Normals of NN on fixed. |
| wght | I&O: Weights associated with points |
|
This is defined in derived class. It calculates the MSE, applies
the rejection criteria (quality improvement checks) which are optional.
If Quality Improvement Checks are used then the weights are updated.
NOTE: All vector sets and the array must have the same size.
(Not tested)
- void DoTransformation()
-
Transform the moving set as estimated.
- int IterationBreak(const int & iteration)
-
Used to determine whether registration is completed.
| iteration | IN: Current Iteration |
|
In other words whether the criterion has been met.
It checks whether iteration==max_iter and/or the rms error has changed
below the threshold.
- BooleanT BasicIterate(const int & iteration)
-
Performs one Basic ICP iteration.
| iteration | IN: Current Iteration |
|
- BooleanT AcceleratedIterate(const int & iteration)
-
Performs one Accelerated ICP Iteration.
| iteration | IN: Current Iteration |
|
- void PrintHeader(void)
-
Prints out header information, which includes key symbol information.
- void PrintResults(const int & iteration)
-
Compute and print results of one iteration.
| iteration | IN: Current Iteration |
|
- void FinalResults()
-
Print the final translation and rotation.
- void Savings()
-
Saves translation, rotation and rms error.
Currently not implemented!!!
- VectorC RigidT_TO_VectorC7(RigidTransC & r)
-
Takes a RigidTransC and returns it as a VectorC. (RigidTransC -> VectorC).
- RigidTransC VectorC7_TO_RigidT(VectorC & qq)
-
Takes a VectorC and returns it as a RigidTransC. (VectorC -> RigidTransC).
NOTE: The involved quaternion is assumed to be valid.
- BodyRefCounterVC & Copy() const
-
Creat a copy of this object.
- BooleanT operator==(const BodyRefCounterVC & oth) const
-
Compair identitys.
- BooleanT operator!=(const BodyRefCounterVC & oth) const
-
Compair identitys.
- BooleanT Save(ostream & out) const
-
Save to ostream.
- void AddReference()
-
Another reference to the object has been created.
- void RemoveReference()
-
One reference to the object was deleted.
Locking scheme
--------------
The object is possible to lock (to make constant). The scheme
assumes that the object is created, it can be locked, after that
it can only be destroyed. The locked object cannot be unlocked.
This locking scheme is very useful
during debugging, using assert() function,
when it is necassary to check that object
is treated as constant and the constancy is not violated by
any casting or passing through the copy constructor of shared
objects.
- void SetConst(void) const
-
This locks the object.
Often objects you wish to lock are already const.
- void SetConst(void)
-
This locks the object.
- BooleanT IsConst(void) const
-
Returns TRUE if the object is locked, ie. it is assumed to be constant.
- BooleanT IsNotConst(void) const
-
Returns TRUE if the object is unlocked.
ie. there is no special
information if the object is constant or not.
Counter state information
-------------------------
- BooleanT ToBeDeleted() const
-
Returns TRUE if there is only one reference to the object and the whole object or its reference counting part can be deleted.
- BooleanT ToBeDeletedRemoveIgnoreNoRemove()
-
Decrement refrence by 1 return true if this leaves no refrences to the object.
- BooleanT ToBeDeletedRemove()
-
Decrement refrence by 1 return true if this leaves no refrences to the object. This also checks the NoRemove flag.
- BooleanT BodyMightBeDeleted() const
-
Returns TRUE if the reference counted part of the object can be deleted, ie. flag NOREMOVE is false .
- BooleanT IsCountZero() const
-
Are there any refrences left ?
- BooleanT BRCPtrCanDeleteObject() const
-
Used by BRRCPtrC to establish if an object has ZERO refrences and can be deleted.
- IntT Count() const
-
Returns the current state of the counter, ie. how many references to this object exist.
- const BodyRefCounterC & operator=(const BodyRefCounterC & b)
-
It has not meaning to assign object 'b' to this object because it would destroy a history of the object which is counted. So this is a dummy function.
- BooleanT IsValidObject() const
-
Test if object is valid.
When amma check is disabled this always returns true.
- BooleanT UserBitTest(IntT x) const
-
Test user flag.
- void UserBitSet(IntT x,BooleanT setit = TRUE)
-
Test user flag.
- void UserBitZero(IntT x)
-
Set bit to zero.
- void ReportBRCError(char * Msg)
-
Report error, used in BRCPtrC.
- UIntT Hash() const
-
Hash on address of object.
- void SetUndeletable()
-
Make object undeletable.
Usefull to prevent recursive deleting in graph structures.
Only hackers need this function.
- void ReportInvalidObject(char * Msg = 0) const
-
Tell user about validation failure.
- LabelT Label() const
-
Returns the label of this reference counter.
The member function
is useful mainly to recognize objects during debugging.
The value of the label is uniquely defined pointer.
|
Programmer: Simon Cunnington , Documentation by CxxDoc: Tue Mar 20 10:49:27 2001
|