[ITK-users] Undefined references to methods of template classes

Matt McCormick matt.mccormick at kitware.com
Thu Jan 15 14:08:02 EST 2015


Hi Francisco,

Good to hear the BinaryImageToShapeLabelMapFilter is working.

This is probably not the source of your issues, but this line

  FeatureValueVectorType* output = textureFilter->GetFeatureMeans();

should be

  FeatureValueVectorType::Pointer output = textureFilter->GetFeatureMeans();

since itk::SmartPointer's [1] are different from raw pointers.

HTH,
Matt

[1] http://www.itk.org/Doxygen/html/classitk_1_1SmartPointer.html


On Thu, Jan 15, 2015 at 12:34 PM, Francisco Lopez de la Franca
<franciscolopezdelafranca at gmail.com> wrote:
> Sorry, I might press the wrong key.
> Hi Matt again.
> You were fully right about setting the background/foreground values for the
> filter. I wasn't using them because I followed the examples and there was no
> reference to them. Now my shape related functions are working.
>
> As for the textures, I attach my code so that anyone can see if i am doing
> something wrong:
>
> typedef itk::Statistics::ScalarImageToTextureFeaturesFilter<TInputImage>
> TextureFilterType;
> typedef typename TextureFilterType::Pointer TextureFilterPtr;
> typedef typename TextureFilterType::FeatureValueVector
> FeatureValueVectorType;
>
> TextureFilterPtr textureFilter = TextureFilterType::New();
> textureFilter->SetInput(_input);
> textureFilter->Update();
>
> FeatureValueVectorType* output = textureFilter->GetFeatureMeans();
>
> cout << "Energy = " << (*output)[0]) << endl;
> cout << "Entropy " << (*output)[1]);
> cout << "LocalHomogeneity = " << (*output)[3]) << endl;
> cout << "Inertia = " << (*output)[4]) << endl;
> cout << "ClusterShade " << (*output)[5]) << endl;
> cout << "ClusterProminence = " << (*output)[6]) << endl;
>
> Sincereously, I thank you a lot your help.
> Regards.
> /Francisco
>
>
>
> 2015-01-15 18:26 GMT+01:00 Francisco Lopez de la Franca
> <franciscolopezdelafranca at gmail.com>:
>>
>> Hi Matt again.
>> You were fully right about setting the background/foreground values for
>> the filter. I
>>
>> 2015-01-15 16:41 GMT+01:00 Matt McCormick <matt.mccormick at kitware.com>:
>>>
>>> Hi Francisco,
>>>
>>> There is definitely something wrong with the textures features.  It is
>>> not possible to know what is going on without more details, though.
>>>
>>> Matt
>>>
>>> On Thu, Jan 15, 2015 at 1:32 AM, Francisco Lopez de la Franca
>>> <franciscolopezdelafranca at gmail.com> wrote:
>>> > Hi Matt,
>>> > Thanks a lot for your answers. I'll try this afternoon what you suggest
>>> > regarding the shape filter, but what do you think about my results as
>>> > for
>>> > the texture filter?
>>> > Regards.
>>> > /Francisco
>>> >
>>> > 2015-01-15 2:30 GMT+01:00 Matt McCormick <matt.mccormick at kitware.com>:
>>> >>
>>> >> Hi Francisco,
>>> >>
>>> >> Great to hear about the progress!
>>> >>
>>> >> The itk::BinaryImageToShapeLabelMapFilter  requires a binary input,
>>> >> which should have an integer pixel type, like unsigned char or
>>> >> unsigned short.  It is important to set the BackgroundValue and
>>> >> ForegroundValue [1] to get this filter to work correctly.
>>> >>
>>> >> HTH,
>>> >> Matt
>>> >>
>>> >> [1]
>>> >>
>>> >> http://www.itk.org/Doxygen/html/classitk_1_1BinaryImageToShapeLabelMapFilter.html
>>> >>
>>> >> On Wed, Jan 14, 2015 at 5:05 PM, Francisco Lopez de la Franca
>>> >> <franciscolopezdelafranca at gmail.com> wrote:
>>> >> > Hi again.
>>> >> > I fixed all the errors and got my library, now ready to be tested.
>>> >> > It contains an encapsulation, on the one hand, of the class
>>> >> > itkBinaryImageToShapeLabelMapFilter in order to get image shape
>>> >> > descriptors
>>> >> > of a 3D binary image, and on the other hand, the same for the class
>>> >> > itkScalarImageToTextureFeaturesFilter to get image texture features
>>> >> > of a
>>> >> > 3D
>>> >> > scalar image.
>>> >> >
>>> >> > I pass as input image to both classes a binary 3D Nifti image
>>> >> > (150x150x150)
>>> >> > containing a cylinder where the inside voxels are 255 and the
>>> >> > outside
>>> >> > voxels
>>> >> > are 0.
>>> >> >
>>> >> > As for the shape issue, it's very strange to me that the call to
>>> >> > GetNumberOfLabelObjects on a itk::LabelMap object returns a value of
>>> >> > 0.
>>> >> > The
>>> >> > main code is as follows:
>>> >> >
>>> >> > binaryImageToShapeLabelMapFilter->SetInput(_input);
>>> >> > binaryImageToShapeLabelMapFilter->ComputePerimeterOn();
>>> >> > binaryImageToShapeLabelMapFilter->Update();
>>> >> >
>>> >> > LabelMapType::Pointer labelMap =
>>> >> > binaryImageToShapeLabelMapFilter->GetOutput();
>>> >> >
>>> >> > int nrOfLabelObjects = labelMap->GetNumberOfLabelObjects();
>>> >> >
>>> >> >
>>> >> > And, as for the texture features, the result of the filter does not
>>> >> > seem
>>> >> > to
>>> >> > be very logic:
>>> >> >
>>> >> > Energy = 1
>>> >> > Entropy = 0
>>> >> > Correlation = 1
>>> >> > Local Homogeneity = 0
>>> >> > Inertia = 0
>>> >> > Cluster Shade = 0
>>> >> > Cluster Prominence = 0
>>> >> >
>>> >> > I've also tested this with a scalar 3D Nifti image and the results
>>> >> > are
>>> >> > the
>>> >> > same.
>>> >> >
>>> >> > And the question is: What kind of image do I have to pass to the
>>> >> > filters
>>> >> > so
>>> >> > that the code would return a more logic expected answer?
>>> >> >
>>> >> > Thank you very much in advance.
>>> >> > My best regars.
>>> >> > /Francisco
>>> >> >
>>> >> > 2015-01-10 22:38 GMT+01:00 Matt McCormick
>>> >> > <matt.mccormick at kitware.com>:
>>> >> >>
>>> >> >> Hi Francisco,
>>> >> >>
>>> >> >> Nice to hear about the progress!
>>> >> >>
>>> >> >> You will need to link your library to the ITK libraries:
>>> >> >>
>>> >> >>   target_link_libraries( mylibrary ${ITK_LIBRARIES} )
>>> >> >>
>>> >> >> HTH,
>>> >> >> Matt
>>> >> >>
>>> >> >> On Sat, Jan 10, 2015 at 4:16 PM, Francisco Lopez de la Franca
>>> >> >> <franciscolopezdelafranca at gmail.com> wrote:
>>> >> >>>
>>> >> >>> Thanks to your previous answer the problem was solved, but another
>>> >> >>> one
>>> >> >>> has come out. It occurs when linking to create the library. It
>>> >> >>> gives
>>> >> >>> an
>>> >> >>> undefined reference to itk::ExceptionObject::ExceptionObject... as
>>> >> >>> you
>>> >> >>> can
>>> >> >>> see below.
>>> >> >>> What it is strange to me is that before including explicit
>>> >> >>> template
>>> >> >>> instantiation, I created the library without errors, and now that
>>> >> >>> I
>>> >> >>> include
>>> >> >>> that, I get this error.
>>> >> >>> I'll appreciate very much any help.
>>> >> >>>
>>> >> >>> Linking CXX shared library libTFM_Features.dll
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> CMakeFiles\TFM_Features.dir/objects.a(TFM_Features.cpp.obj):TFM_Features.cpp:(.t
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> ext$_ZN3itk21MemoryAllocationErrorC1ERKSsjS2_S2_[_ZN3itk21MemoryAllocationErrorC
>>> >> >>> 1ERKSsjS2_S2_]+0x35): undefined reference to
>>> >> >>> `itk::ExceptionObject::ExceptionObj
>>> >> >>> ect(std::string const&, unsigned int, std::string const&,
>>> >> >>> std::string
>>> >> >>> const&)'
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> CMakeFiles\TFM_Features.dir/objects.a(TFM_Features.cpp.obj):TFM_Features.cpp:(.t
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> ext$_ZN3itk21MemoryAllocationErrorC1ERKSsjS2_S2_[_ZN3itk21MemoryAllocationErrorC
>>> >> >>> 1ERKSsjS2_S2_]+0x40): undefined reference to `vtable for
>>> >> >>> itk::MemoryAllocationEr
>>> >> >>> ror'
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> C:/CV/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-min
>>> >> >>> gw32/bin/ld.exe:
>>> >> >>> CMakeFiles\TFM_Features.dir/objects.a(TFM_Features.cpp.obj): ba
>>> >> >>> d reloc address 0x40 in section
>>> >> >>> `.text$_ZN3itk21MemoryAllocationErrorC1ERKSsjS2_
>>> >> >>> S2_[_ZN3itk21MemoryAllocationErrorC1ERKSsjS2_S2_]'
>>> >> >>> collect2.exe: error: ld returned 1 exit status
>>> >> >>> SRC\CMakeFiles\TFM_Features.dir\build.make:219: recipe for target
>>> >> >>> 'SRC/libTFM_Fe
>>> >> >>> atures.dll' failed
>>> >> >>> mingw32-make[2]: *** [SRC/libTFM_Features.dll] Error 1
>>> >> >>> CMakeFiles\Makefile2:77: recipe for target
>>> >> >>> 'SRC/CMakeFiles/TFM_Features.dir/all'
>>> >> >>>  failed
>>> >> >>> mingw32-make[1]: *** [SRC/CMakeFiles/TFM_Features.dir/all] Error 2
>>> >> >>> Makefile:74: recipe for target 'all' failed
>>> >> >>> mingw32-make: *** [all] Error 2
>>> >> >>>
>>> >> >>>
>>> >> >>> 2015-01-09 21:02 GMT+01:00 Matt McCormick
>>> >> >>> <matt.mccormick at kitware.com>:
>>> >> >>>>
>>> >> >>>> Hi Francisco,
>>> >> >>>>
>>> >> >>>> In order for the templates to be available in the library, they
>>> >> >>>> must
>>> >> >>>> be explicitly instantiated [1].
>>> >> >>>>
>>> >> >>>> HTH,
>>> >> >>>> Matt
>>> >> >>>>
>>> >> >>>> [1] http://www.cplusplus.com/articles/1C75fSEw/
>>> >> >>>>
>>> >> >>>> On Fri, Jan 9, 2015 at 2:59 PM, Francisco Lopez de la Franca
>>> >> >>>> <franciscolopezdelafranca at gmail.com> wrote:
>>> >> >>>> > Hi.
>>> >> >>>> > I' like to create a library containing, for example, one
>>> >> >>>> > template
>>> >> >>>> > class with
>>> >> >>>> > a number of methods.
>>> >> >>>> > I've programmed a simple example and the compilation and
>>> >> >>>> > generation
>>> >> >>>> > of
>>> >> >>>> > the
>>> >> >>>> > library goes fine. I use the cmake "add_library" command for
>>> >> >>>> > generating the
>>> >> >>>> > library.
>>> >> >>>> >
>>> >> >>>> > The problem arises at the moment of testing the library. I get
>>> >> >>>> > an
>>> >> >>>> > undefined
>>> >> >>>> > reference for every method in the template class.
>>> >> >>>> >
>>> >> >>>> > I've downloaded a tool to look in the contents (functions) of
>>> >> >>>> > dynamic
>>> >> >>>> > libraries, and there is no function in the library. If I add
>>> >> >>>> > another
>>> >> >>>> > class
>>> >> >>>> > (not a template class), then, this tool shows me only the
>>> >> >>>> > functions
>>> >> >>>> > in
>>> >> >>>> > this
>>> >> >>>> > latter class.
>>> >> >>>> >
>>> >> >>>> > Has anyone ever come across with this problem?
>>> >> >>>> >
>>> >> >>>> > Thanks a lot in advance.
>>> >> >>>> > Regards
>>> >> >>>> > /Francisco
>>> >> >>>> >
>>> >> >>>> > _____________________________________
>>> >> >>>> > 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.php
>>> >> >>>> >
>>> >> >>>> > 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://public.kitware.com/mailman/listinfo/insight-users
>>> >> >>>> >
>>> >> >>>
>>> >> >>>
>>> >> >>
>>> >> >
>>> >
>>> >
>>
>>
>


More information about the Insight-users mailing list