[vtk-developers] ICP Enhancement - TooFarThreshold
David Doria
daviddoria+vtk at gmail.com
Tue Feb 23 08:38:45 EST 2010
On Tue, Feb 23, 2010 at 3:43 AM, Luca Antiga <luca.antiga at gmail.com> wrote:
> Hi David,
> thanks a lot for this contribution, it will probably solve a few problems
> I had with ICP in the past.
> A few suggestions:
>
> - I'd suggest is to add a UseTooFarThreshold flag with the
> relative vtkSetMacro, vtkGetMacro and vtkBooleanMacro to activate/deactivate
> TooFar (as in UseTooFarThresholdOn, UseTooFarThresholdOff, etc) instead
> of resorting to the -1.0 trick;
>
> - there is an indentation glitch in the for loop;
>
> - you don't really need to Delete closestp, just use
> closestp->Initialize();
>
> - actually, the code will crash if rerun with TooFar on first and TooFar
> off afterwards, because in the latter you call closestp->SetPoint without
> first setting the NumberOfPoints after you Delete and instantiate a new one
> (or call Initialize).
>
> - TooFarThreshold is compared to dist2, which is the squared distance; my
> vote is for specifying it as a distance and square it internally;
>
> - I personally would handle sourceLandmarks in a bit more readable way: the
> smart pointer initialized in the else scope and used outside will behave
> correctly feels weird, but it's just that I'm old fashioned. Read below for
> a proposal.
>
> Here's my try:
>
> double tooFarThreshold2 = this->TooFarThreshold * this->TooFarThreshold;
> do
> {
> // Fill points with the closest points to each vertex in input
> if (!this->UseTooFarThreshold)
> {
> closestp->SetNumberOfPoints(nb_points); // It was set above, but at
> this point it should be removed from there
> for(i = 0; i < nb_points; i++)
> {
> this->Locator->FindClosestPoint(a->GetPoint(i),
> outPoint,
> cell_id,
> sub_id,
> dist2);
> closestp->SetPoint(i, outPoint);
> }
> this->LandmarkTransform->SetSourceLandmarks(a);
> }
> else //use a TooFarThreshold
> {
> vtkPoints* sourceLandmarks = vtkPoints::New();
> closestp->Initialize();
> for(i = 0; i < nb_points; i++)
> {
> this->Locator->FindClosestPoint(a->GetPoint(i),
> outPoint,
> cell_id,
> sub_id,
> dist2);
> if(dist2 < tooFarThreshold2)
> {
> closestp->InsertNextPoint(outPoint);
> sourceLandmarks->InsertNextPoint(a->GetPoint(i));
> }
> }
> this->LandmarkTransform->SetSourceLandmarks(sourceLandmarks);
> sourceLandmarks->Delete();
> }
> // Build the landmark transform
>
> this->LandmarkTransform->SetTargetLandmarks(closestp);
> this->LandmarkTransform->Update();
>
>
> Cheers
>
>
> Luca
>
Luca -
Overall, sounds/looks good to me.
1) UseTooFarThreshold - Sure, I like it.
2) I had never used Initialize() - so if it clears the data without having
to delete it, that was my goal.
3) Any reason to compare TooFarThreshold2 to dist2 instead of
TooFarThreshold to sqrt(dist2)?
Any other thoughts?
Thanks,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20100223/a99bbdfb/attachment.html>
More information about the vtk-developers
mailing list