Developer Documentation
Centre for Vision, Speech & Signal Processing
USER IN NAMESPACE AMMA TREE ROOT AMMA SEARCH AMMA HOME
 

  PUBLIC
RanRegisC::NoValidPoints(const FloatRangeC &)
RanRegisC::RanRegisC(const FloatRangeC &,const FloatRangeC &,const int &,const RigidTransC &)
RanRegisC::~RanRegisC(void)
RanRegisC::GetNNPairs(VectorSetC &,VectorSetC &,VectorSetC &,RealSArray1dC &,SArray1dC &,int &)
RanRegisC::LabelLookup(void)
RanRegisC::Lookup2RSquare(const PixelC &,PixelC &,PixelC &,PixelC &,PixelC &)
RanRegisC::NearestInsideSquare(const PixelC &,const Vector3dC &)
RanRegisC::ExpandNeighbourhood(PixelC &,PixelC &,IndexT &,IndexT &,IndexT &,IndexT &)
RanRegisC::GetNearest(const Vector3dC &,Vector3dC &,Vector3dC &,double &,EnumRSquareStatus &)
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
RanRegisC
 
RanRegisC uses the Range Image Search Nearest Neighbour Method and is reference counted (Big Object).
 
include "amma/RanRegis.hh"
User Level:Default
Library:POLREGIS
Example: cri.cc
Section: 3D Surface.Registration
In Scope:std

Comments:
RanRegisC is derived from the base abstract class BaseRegisC and is reference counted (Big Object). This is the Body and should not be used directly. It should be used by the provided Handle Class.

The class requires two range images (FloatRangeC).

An initial guess is required to start the iterative process of motion estimate, which is passed to PerformRegistration (a member function of BaseRegisC). The result of the final transformation that registers the two surfaces will be returned as a RigidTransC.

The constructor uses the first range image to do the nearest neighbour (NN) search on.

There are various options provided by the constructor and member functions, which affect results, except the trace option. See the Base Class for more details on these options.

Parent Classes: Variables:
const double SlopeThresholdM;
cos(1.46) : Better than -> 3.0/1.0

const int NeighbourHThresholdM;
Neighbourhood Threshold (5x5)

FloatRangeC fixedM;
Fixed surface

ByteImageC lookUpM;
Tells you whether a range square is invalid, valid, or whether its on a boundary

Methods:
int NoValidPoints(const FloatRangeC & mov)
This is to be used by the constructor only!!!!!
movIN: The moveable object
It is just to determine the number of valid points within the moveable FloatRangeC.

RanRegisC(const FloatRangeC & fix,const FloatRangeC & mov,const int & trace = 0,const RigidTransC & preReg = RigidTransC())
Constructor
fix IN: The fixed object
mov IN: The moveable object
traceIN: 1 = Detailed prints & save data
0 = No prints, no savings


~RanRegisC()
Destructor

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
boundCheckAffectedWeightsOUT: Whether any weights were
affected by the boundary check
It uses the method defined in RanRegis::GetNearest() to find a nearest point.

void LabelLookup(void)
Labels the lookUpM byte image.
It is used as a lookup to know whether a range square is invalid, valid or on a boundary.

void Lookup2RSquare(const PixelC & pxl,PixelC & topl,PixelC & topr,PixelC & botl,PixelC & botr)
Takes the x,y position used with lookUpM, and converts them into coordinates that are associated with a range square.
pxl IN: Pixel we want mapped to the range square
toplOUT: Top left corner of range square
toprOUT: Top right corner of range square
botlOUT: Bottom left corner of range square
botrOUT: Bottom right corner of range square
NOTE: No error checking is done to see if the value of pxl is within a valid range.

TriNearestT NearestInsideSquare(const PixelC & pxl,const Vector3dC & point)
Returns the nearest point in a range square.
pxl IN: Pixel related to a range square
pointIN: The point which we want to find nearest point for
on the range square
NOTE: No error checks are done to see if the range square, pxl, is refering to is valid.

void ExpandNeighbourhood(PixelC & minTopLeftPxl,PixelC & maxBotRightPxl,IndexT & minRow,IndexT & maxRow,IndexT & minCol,IndexT & maxCol)
This is used to expand a neighbourhood.
minTopLeftPxl I&O: Top left corner in neighbourhood
maxBotRightPxlI&O: Bottom right corner in neighbourhood
minRowOUT: Minimum row
maxRowOUT: Maximum row
minColOUT: Minimum column
maxColOUT: Maximum column
The neighbourhood is defined by the top left corner and bottom right corner. It also calculates the minimum & maximum rows and columns, so that the neighbourhood can be done in strips. Eg top and bottom row done first, then the columns.

*******    -------   By doing it like this,
|:::::| _\ *:::::*   it stops the corners of
|:::::|  / *:::::*   the neighbourhood being
*******    -------   checked twice.

Normally you would expect a neighbourhood thats 3x3 to goto 5x5, but if we are in the corner of an image then it might goto a 4x4.

If when this function is called and we are at the maximum neighbourhood size (the image size), then an error is printed and the program is terminated. This means either no nearest neighbours have been found that could meet the criteria or the range image consisted of invalid range squares only.


void GetNearest(const Vector3dC & r,Vector3dC & rnearest,Vector3dC & normal,double & distance,EnumRSquareStatus & bflag)
This function is used to get a nearest point, along with its associated normal and distance from the point r, as well as whether the point is sitting on a valid range square or boundary range square.
r IN: Point we want to find nearest for
rnearestOUT: The nearest point
normal OUT: The normal associated with the nearest point
distanceOUT: The distance between r and rnearest
bflag OUT: Whether we successfully found a nearest point
If we cannot find a nearest point that meets the criterian then bflag is set to invalid. This means rnearest, normal, and distance are invalid. Hence bflag must be tested to know whether the NN search was successful.

#include "amma/BaseRegis.hh"
void SetExpectedRT(const RigidTransC & exp = RigidTransC())
Sets the expected Final translation & rotation.
expIN: 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.
iterationIN: Maximum number of iterations


void SetPrediction(const EnumPrediction & prediction = noPrediction)
Whether to use prediction or basic ICP.
predictionIN: noPrediction = No Prediction
prediction = Perform Prediction


void SetRMSThresh(const double & ratioThres = 0.99)
Set threshold for RMS error.
ratioThresIN: 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.
regWayIN: regis = Regis
pRegis = PRegis

THE DEFAULT IS THE ONLY OPTION CURRENTLY USED !!!!


void SetRegType(const SceModT & regType = scene_scene)
Defines the registration type.
regTypeIN: 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.
mseCalcIN: 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.
boundIN: 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.
normalIN: 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.
sigmaIN: 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.
hstIN: 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.
comfnameIN: Filename for .com file
movfnameIN: 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.
guessIN: Initial guess


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
boundCheckAffectedWeightsOUT: 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.
distanceIN: 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.
iterationIN: 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.
iterationIN: Current Iteration


BooleanT AcceleratedIterate(const int & iteration)
Performs one Accelerated ICP Iteration.
iterationIN: 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.
iterationIN: 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).
rIN: RigidTransC


RigidTransC VectorC7_TO_RigidT(VectorC & qq)
Takes a VectorC and returns it as a RigidTransC. (VectorC -> RigidTransC).
qqIN : VectorC

NOTE: The involved quaternion is assumed to be valid.


#include "amma/BRefCntV.hh"
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.

#include "amma/BRefCnt.hh"
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.

#include "amma/RefCBase.hh"
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