[Insight-users] Get ID from a neighbor found using a kd-tree?
motes motes
mort.motes at gmail.com
Mon Nov 2 12:21:19 EST 2009
Hm I am not sure I understand the below code. What I need is basically
the possibility to call:
TreeType::InstanceIdentifierVectorType neighbors;
tree->Search( queryPoint, numberOfNeighbors, neighbors ) ;
but where neighbors could be:
std::vector<MyNeighborType> neighbors;
instead of:
TreeType::InstanceIdentifierVectorType neighbors;
In the MyNeighborType I can then define an ID and fields for eg.
deformation vectors. This way when I get the closest neighbors I can
also look up their deformation vectors.
On Mon, Nov 2, 2009 at 5:54 PM, David Doria <daviddoria+itk at gmail.com> wrote:
> Mon, Nov 2, 2009 at 10:49 AM, motes motes <mort.motes at gmail.com> wrote:
>> Hm maybe implementing my own "InstanceIdentifier" type could be a
>> solution since the neighbors are basically a list of
>> InstanceIdentifiers:
>>
>> typedef std::vector< InstanceIdentifier > InstanceIdentifierVectorType;
>>
>> (from itkKdTree.h)
>>
>>
>>
>> On Mon, Nov 2, 2009 at 4:40 PM, motes motes <mort.motes at gmail.com> wrote:
>>> I am using the itk::kdtree to find the k-nearest neighbors from a
>>> queryPoint within a specified radius.From the example: KdTree.cxx it
>>> looks something like this:
>>>
>>> double radius = 437.0;
>>> tree->Search( queryPoint, radius, neighbors ) ;
>>> std::cout << "kd-tree radius search result:" << std::endl
>>> << "query point = [" << queryPoint << "]" << std::endl
>>> << "search radius = " << radius << std::endl;
>>> std::cout << "measurement vector : distance" << std::endl;
>>> for ( unsigned int i = 0 ; i < neighbors.size() ; ++i )
>>> {
>>> std::cout << "[" << tree->GetMeasurementVector( neighbors[i] )
>>> << "] : "
>>> << distanceMetric->Evaluate(
>>> tree->GetMeasurementVector( neighbors[i]))
>>> << std::endl;
>>> }
>>>
>>>
>>> But each neighbors is actually an object that contains a deformation
>>> vector and a unique identifier: ID.
>>>
>>> How do I lookup the ID and the deformation vector from the neighbors
>>> returned from the "Search" call?
>>>
>>> It seems that this is not possible with the above implementation of a
>>> kd-tree since a neighbor is only identified by a vector which does not
>>> allow for any extra information.
>
>
>
> Motes,
>
> I asked Luis about KDTrees one time. He said to use itkPointLocator2
> that he wrote for QuadEdgeMeshRigidRegistration (available on the
> Insight Journal). Here is an example I put together with it. I'm not
> sure if this answers your question?
>
> #include "itkPoint.h"
> #include "itkPointSet.h"
>
> #include "itkPointLocator2.h" //from QuadEdgeMeshRigidRegistration
>
> int main()
> {
> typedef float PixelType;
> const unsigned int Dimension = 3;
> typedef itk::PointSet< PixelType, Dimension > PointSetType;
> typedef PointSetType::PointType PointType;
> typedef PointSetType::PointsContainerPointer PointsContainerPointer;
>
> PointSetType::Pointer PointSet = PointSetType::New();
> PointsContainerPointer points = PointSet->GetPoints();
>
> //create points
> PointType p0, p1, p2, p3, p4, p5, p6, p7, p8;
>
> p0[0]= 0.0; p0[1]= 0.0; p0[2]= 0.0;
> points->InsertElement( 0, p0 );
> p1[0]= 0.1; p1[1]= 0.0; p1[2]= 0.0;
> points->InsertElement( 1, p1 );
> p2[0]= 0.0; p2[1]= 0.1; p2[2]= 0.0;
> points->InsertElement( 2, p2 );
> p3[0]= 5.0; p3[1]= 5.0; p3[2]= 5.0;
> points->InsertElement( 3, p3 );
> p4[0]= 5.1; p4[1]= 5.0; p4[2]= 5.0;
> points->InsertElement( 4, p4 );
> p5[0]= 5.0; p5[1]= 5.1; p5[2]= 5.0;
> points->InsertElement( 5, p5 );
> p6[0]= -5.0; p6[1]= -5.0; p6[2]= -5.0;
> points->InsertElement( 6, p6 );
> p7[0]= -5.1; p7[1]= -5.0; p7[2]= -5.0;
> points->InsertElement( 7, p7 );
> p8[0]= -5.0; p8[1]= -5.1; p8[2]= -5.0;
> points->InsertElement( 8, p8 );
>
> typedef itk::PointLocator2<PointSetType> PointLocatorType;
> PointLocatorType::Pointer locator = PointLocatorType::New();
>
> locator->SetPointSet( PointSet );
> locator->Initialize();
>
> PointType query;
> query[0] = 0.12; query[1] = 0.0; query[2] = 0.0;
> PointLocatorType::PointType point( query );
>
> typedef PointLocatorType::InstanceIdentifierVectorType
> InstanceIdentifierVectorType;
> InstanceIdentifierVectorType result1;
>
> locator->Search( point, static_cast<unsigned int> (2), result1 );
>
> /*
> //equivalent to this: (must do one of these or the Search() overload
> is ambiguous
> unsigned int NumNeighbors = 2;
> locator->Search( point, NumNeighbors, result );
> */
>
> std::cout << "Result: " << result1[0] << " " << result1[1] << std::endl;
>
> ///////////////////////////////////////
> PointType query2;
> query2[0] = -5.1; query2[1] = -4.8; query2[2] = -4.9;
> PointLocatorType::PointType point2( query2 );
>
> InstanceIdentifierVectorType result2;
> locator->Search( point2, 1.0, result2 );
> for(unsigned int i = 0; i < result2.size(); i++)
> {
> std::cout << result2[i] << " ";
> }
>
> return 0;
> }
>
>
> Thanks,
>
> David
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
More information about the Insight-users
mailing list