[Insight-users] reading unknown transform - how to itk::TransformFactory<TransformType>::RegisterTransform(); ???
Darren Weber
darren.weber.lists at gmail.com
Wed Oct 21 17:17:38 EDT 2009
A solution is to define the supported transform types as global typedefs,
e.g.:
typedef itk::AffineTransform< double, iImgDimension > AffineTransformType;
const unsigned int SpaceDimension = iImgDimension;
const unsigned int SplineOrder = 3;
typedef double CoordinateRepType;
typedef
itk::BSplineDeformableTransform<CoordinateRepType,SpaceDimension,SplineOrder>
BSplineTransformType;
itk::TransformFactory<BSplineTransformType>::RegisterTransform();
These types can be used in main() and other functions (there can be a
function for each transform type). This is one of those functions:
BSplineTransformType::Pointer getBSplineXFM(
itk::TransformFileReader::TransformListType *transforms )
{
BSplineTransformType::Pointer xfm, xfmRead;
// Then use an STL iterator on the list of transforms and apply
// the proper casting of the resulting transform.
itk::TransformFileReader::TransformListType::const_iterator transformIt;
transformIt = --(transforms->end()); // get last transform in list
if( ! strcmp(
(*transformIt)->GetNameOfClass(),"BSplineDeformableTransform"))
{
xfmRead = static_cast<BSplineTransformType*>(
(*transformIt).GetPointer() );
xfm = dynamic_cast<BSplineTransformType*>( xfmRead.GetPointer() );
}
return xfm;
}
This is a small snippet of the main() code that chooses which function to
call:
// The transform reader is not template and therefore it returns a list
// of transforms. However, the reader can instantiate the appropriate
// transform class while reading the file, but it is up to the user to
// do the appropriate cast.
AffineTransformType::Pointer xfmAffine;
BSplineTransformType::Pointer xfmBspline;
if( ! affinePath.empty() )
xfmAffine = getAffineXFM( transformReader->GetTransformList() );
if( ! bsplinePath.empty() )
xfmBspline = getBSplineXFM( transformReader->GetTransformList() );
...
What would this look like using a factory method? Can the factory
programming style be easily gleaned from the IO classes or examples?
Thanks,
Darren
On Mon, Oct 19, 2009 at 10:48 AM, Luis Ibanez <luis.ibanez at kitware.com>wrote:
> Hi Darren,
>
> What do you call an "Unkown" transform ?
>
> An ITK transform of a well defined type, but whose actual type is not
> currently
> known to the application user ?
>
Yes.
>
> If so, then you (as a developer) will have to implement a cascade of
> reading attempts for all the Transform types that are supported by
> your application.
>
> The factory makes easier for you to register all those potential
> readers, and to try them in sequence.
>
> This is a similar situation to reading an image from a file without
> knowing in advance what is the specific pixel type of that image.
>
>
> I have to admit that the resulting code is not going to be pretty....
>
> However, the only way to simplify it would be to have a predefined
> list of the transform that your application support, and then package
> the reading process into a single function.
>
>
> Regards,
>
>
> Luis
>
>
>
> ---------------------------------------------------------------------------------------------
> On Tue, Oct 13, 2009 at 6:01 PM, Darren Weber
> <darren.weber.lists at gmail.com> wrote:
> >
> > With regard to reading a transform file, using itk::TransformFileReader,
> > given the example:
> > examples/IO/TransformReadWrite.cxx
> >
> > This example uses the following code to register and read a known
> > BSplineTransformType, i.e.:
> >
> > typedef itk::BSplineDeformableTransform<double,3,5> BSplineTransformType;
> > ...
> > itk::TransformFileReader::Pointer reader;
> > reader = itk::TransformFileReader::New();
> > // Some transforms (like the BSpline transform) might not be registered
> > // with the factory so we add them manually.
> > itk::TransformFactory<BSplineTransformType>::RegisterTransform();
> > reader->SetFileName( "Transforms.meta" );
> > try
> > {
> > reader->Update();
> > }
> > catch( itk::ExceptionObject & excp )
> > {
> > std::cerr << "Error while reading the transform file" << std::endl;
> > std::cerr << excp << std::endl;
> > std::cerr << "[FAILED]" << std::endl;
> > return EXIT_FAILURE;
> > }
> >
> >
> > Now let's assume a transform file contains an unknown transform type.
> >
> > What is the role of the transform factory? Is it required to read a
> > transform file? Is it possible to read a unknown transform file and
> > register a given transform type with the transform factory after reading
> the
> > file?
> >
> > Suppose the transform file contains a BSplineTransformType, but the
> > parameters are unknown. Is it possible to read this transform file?
> >
> > TIA and take care,
> > Darren
> >
> >
> > _____________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.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
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20091021/2294a77d/attachment-0001.htm>
More information about the Insight-users
mailing list