[Insight-users] Using MetaIO for trees of TubeSpatialObjects
Julien Jomier
jjomier at cs.unc.edu
Fri Feb 3 11:33:27 EST 2006
Hi Dan,
You should not use the MetaTubeConverter directly but the
SpatialObjectWriter instead (which uses the MetaTubeConverter internally
but go through the hierarchy of SpatialObjects).
You can take a look at the example:
Insight/Examples/SpatialObjects/ReadWriteSpatialObject.cxx
Let us know if you have further problems,
Julien
Dan Mueller wrote:
> Hi all,
>
> I have some questions regarding the itk::SpatialObject classes.
>
> I have a simple application which creates a tree of itk::TubeSpatialObjects (please find source code attached).
> This application creates tube1 and tube1_1, calls tube1->AddSpatialObject(tube1_1), and uses the itk::MetaTubeConverter to save the object as a Meta file (*.mhd).
>
> However, the itk::MetaTubeConverter does not write the itk:SpatialObject child nodes to the Meta file (see output Meta file below).
>
> How do I save the entire tube network to a Meta file?
> Am I missing something with the itk::SpatialObject::AddSpatialObject(..) call? I have tried using itk::TubeSpatialObject::SetParentPoint(..) and itk::TubeSpatialObject::SetRoot(..) but I can't seem to make them work either. Should I be using a different Meta converter class, like itk::MetaGroupConverter? Am I on the right track, or did I miss the point somewhere?
>
> Any help would be appreciated!
>
>
> Output Meta file (note that only tube1 is written):
> --------------------
> ObjectType = Tube
> NDims = 3
> Color = 1 0 0 1
> TransformMatrix = 1 0 0 0 1 0 0 0 1
> Offset = 0 0 0
> CenterOfRotation = 0 0 0
> ElementSpacing = 1 1 1
> Root = False
> PointDim = x y z r v1x v1y v1z v2x v2y v2z tx ty tz red green blue alpha id
> NPoints = 5
> Points =
> 10.5 10 15 4 0 0 0 0 0 0 0 0 0 1 0 0 1 -1
> 50 30.5 30 2 0 0 0 0 0 0 0 0 0 1 0 0 1 -1
> 65 45.5 30 3 0 0 0 0 0 0 0 0 0 1 0 0 1 -1
> 100 115 60 2 0 0 0 0 0 0 0 0 0 1 0 0 1 -1
> 170 60 200 1.55 0 0 0 0 0 0 0 0 0 1 0 0 1 -1
> --------------------
>
> Note: I am using Windows XP, ITK v2.4.1, VC++ 2003.
>
> Cheers
>
> Dan Mueller [d.mueller at qut.edu.au]
>
> School of Engineering Systems
> Faculty of Built Environment and Engineering
> Queensland University of Technology (QUT)
> Brisbane, Queensland, Australia
> CRICOS No.: 00213J
>
>
> ------------------------------------------------------------------------
>
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include "itkGroupSpatialObject.h"
> #include "itkLineSpatialObject.h"
> #include "itkEllipseSpatialObject.h"
> #include "itkLineSpatialObjectPoint.h"
> #include "itkTubeSpatialObject.h"
> #include "itkTubeSpatialObjectPoint.h"
> #include "itkMetaTubeConverter.h"
>
> int main(int argc, char * argv[])
> {
> try
> {
> //Check the input arguments:
> // 0 = Application name
> // 1 = Output meta file path
> if (argc != 2)
> {
> std::cerr << "Usage: " << std::endl;
> std::cerr << argv[0] << " OutputMetaFile" << std::endl;
> return EXIT_FAILURE;
> }
>
> //Declare pixel and image types
> const unsigned int Dimension = 3;
> typedef unsigned char PixelType;
> typedef itk::Image<PixelType, Dimension> ImageType;
>
> //Declare SpatialObject types
> typedef itk::GroupSpatialObject<Dimension> GroupType;
> typedef itk::EllipseSpatialObject<Dimension> EllipseType;
> typedef itk::LineSpatialObject<Dimension> LineType;
> typedef itk::LineSpatialObjectPoint<Dimension> LinePointType;
> typedef itk::TubeSpatialObject<Dimension> TubeType;
> typedef itk::TubeSpatialObjectPoint<Dimension> TubePointType;
>
> //Create some tube points
> TubePointType point1_1;
> point1_1.SetPosition(10.5, 10.0, 15.0);
> point1_1.SetRadius(4.0);
>
> TubePointType point1_2;
> point1_2.SetPosition(50, 30.5, 30.0);
> point1_2.SetRadius(2.0);
>
> TubePointType point1_3;
> point1_3.SetPosition(65.0, 45.5, 30.0);
> point1_3.SetRadius(3.0);
>
> TubePointType point1_4;
> point1_4.SetPosition(100.0, 115.0, 60.0);
> point1_4.SetRadius(2.0);
>
> TubePointType point1_5;
> point1_5.SetPosition(170.0, 60.0, 200.0);
> point1_5.SetRadius(1.55);
>
> TubePointType point1_1_1;
> point1_1_1.SetPosition(100.0, 115.0, 60.0);
> point1_1_1.SetRadius(2.0);
>
> TubePointType point1_1_2;
> point1_1_2.SetPosition(65.0, 130.0, 60.0);
> point1_1_2.SetRadius(1.0);
>
> TubePointType point1_1_3;
> point1_1_3.SetPosition(35.0, 130.0, 90.0);
> point1_1_3.SetRadius(3.5);
>
> //Create "root" tube
> TubeType::Pointer tube1 = TubeType::New();
> tube1->GetPoints().push_back(point1_1);
> tube1->GetPoints().push_back(point1_2);
> tube1->GetPoints().push_back(point1_3);
> tube1->GetPoints().push_back(point1_4);
> tube1->GetPoints().push_back(point1_5);
>
> //Create the "child" tube
> TubeType::Pointer tube1_1 = TubeType::New();
> tube1_1->GetPoints().push_back(point1_1_1);
> tube1_1->GetPoints().push_back(point1_1_2);
> tube1_1->GetPoints().push_back(point1_1_3);
>
> //Add child tube to root tube
> tube1->SetRoot(true);
> tube1->AddSpatialObject(tube1_1);
> tube1->SetRoot(true);
> tube1_1->SetParentPoint(3); //point1_4 is the parent point of tube1_1
>
> //Print some debug info
> char buffer[10];
> std::cout << "Tube1 (the root) has " << itoa(tube1->GetNumberOfChildren(), buffer, 10) << " child\\children" << std::endl;
> std::cout << "Tube1_1 (the child) HasParent=" << tube1_1->HasParent()<< std::endl;
>
> //Write SpatialObject to Meta file
> itk::MetaTubeConverter<Dimension> metaWriter;
> metaWriter.WriteMeta(tube1, argv[1]);
> }
> catch (itk::ExceptionObject & err)
> {
> std::cout << "ExceptionObject caught !" << std::endl;
> std::cout << err << std::endl;
> return EXIT_FAILURE;
> }
>
> return EXIT_SUCCESS;
>
> }//end main()
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
More information about the Insight-users
mailing list