[ITK-users] get outputs from a std::vector list of smart-pointers of image-filters
Grothausmann, Roman Dr.
grothausmann.roman at mh-hannover.de
Fri Sep 16 07:42:24 EDT 2016
On 12/09/16 17:41, Dženan Zukić wrote:
> can you turn
> smoother->SetInput(savedPointers[i]->GetOutput());
> into
> if (i==0)
>
> smoother->SetInput(static_cast<CastFilterType::Pointer>(savedPointers[i])->GetOutput());
> else
>
> smoother->SetInput(static_cast<GaussianFilterType::Pointer>(savedPointers[i])->GetOutput());
> or something similar and see whether that works?
Did so,
https://github.com/romangrothausmann/ITK-CLIs/commit/2cd1fbe4406eccbd6552e88e8be0a0ab1aad4ba6
but still getting compile errors like:
resample.cxx:73:5: error: no matching function for call to
?std::vector<itk::SmartPointer<itk::ProcessObject>
>::push_back(itk::CastImageFilter<itk::Image<float, 1u>, itk::Image<float, 1u>
>::Pointer&)?
savedPointers.push_back(caster);
and
resample.cxx:80:25: error: invalid user-defined conversion from
?itk::SmartPointer<itk::ProcessObject>? to
?itk::SmartPointer<itk::CastImageFilter<itk::Image<float, 1u>, itk::Image<float,
1u> > >::ObjectType* {aka itk::CastImageFilter<itk::Image<float, 1u>,
itk::Image<float, 1u> >*}? [-fpermissive]
smoother->SetInput(static_cast<typename
CastFilterType::Pointer>(savedPointers[i])->GetOutput());
I also tried Your suggestion on the .GetPointer() variant:
https://github.com/romangrothausmann/ITK-CLIs/commit/4a96d962430461c0b26de9363a1ccf623b9c9840
which compiles but segfaults when executed.
A third variant stores the Output SPs in a separate list:
https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189
but compilation stops with:
resample.cxx:77:5: error: request for member ?GetPointer? in
?caster.itk::SmartPointer<TObjectType>::operator-><itk::CastImageFilter<itk::Image<float,
1u>, itk::Image<float, 1u> > >()->itk::CastImageFilter<itk::Image<float, 1u>,
itk::Image<float, 1u>
>::<anonymous>.itk::UnaryFunctorImageFilter<itk::Image<float, 1u>,
itk::Image<float, 1u>, itk::Functor::Cast<float, float>
>::<anonymous>.itk::InPlaceImageFilter<itk::Image<float, 1u>, itk::Image<float,
1u> >::<anonymous>.itk::ImageToImageFilter<itk::Image<float, 1u>,
itk::Image<float, 1u>
>::<anonymous>.itk::ImageSource<TOutputImage>::GetOutput<itk::Image<float, 1u>
>()?, which is of pointer type ?itk::ImageSource<itk::Image<float, 1u>
>::OutputImageType* {aka itk::Image<float, 1u>*}? (maybe you meant to use ?->? ?)
savedOutPointers.push_back(caster->GetOutput().GetPointer());
^
Any other ideas how to get this working?
Many thanks for looking into this.
Roman
> On Mon, Sep 12, 2016 at 5:41 AM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de <mailto:grothausmann.roman at mh-hannover.de>>
> wrote:
>
> On 09/09/16 16:21, Dženan Zukić wrote:
>
> Hi Roman,
>
> you should not save the pointer the SmartPointer encapsulates, but
> rather the
> SmartPointer itself. The saving line of code should not be
> savedPointers.push_back(caster.GetPointer());
> but rather
> savedPointers.push_back(caster);
> and later usage should not be
> smoother->SetInput(dynamic_cast<ISType*>(savedPointers[i].GetPointer())->GetOutput());
> but rather
> smoother->SetInput(savedPointers[i]->GetOutput());
>
>
> Many thanks Dženan for Your reply. I tried as You suggested:
>
> https://github.com/romangrothausmann/ITK-CLIs/commit/b00551faf951192f50e4090d683300524b4c95ba
> <https://github.com/romangrothausmann/ITK-CLIs/commit/b00551faf951192f50e4090d683300524b4c95ba>
>
> but am getting:
>
> resample.cxx:79:49: error: no matching function for call to
> ?itk::ProcessObject::GetOutput()?
> smoother->SetInput(savedPointers[i]->GetOutput());
> ^
> resample.cxx:79:49: note: candidates are:
> In file included from resample.cxx:5:
> /opt/itk-4.9.1/include/ITK-4.9/itkProcessObject.h:612:16: note:
> itk::DataObject* itk::ProcessObject::GetOutput(const DataObjectIdentifierType&)
> DataObject * GetOutput(const DataObjectIdentifierType & key);
> ^
>
> I also tried:
> std::vector<itk::ProcessObject> savedPointers;
> std::vector<itk::ISType> savedPointers;
> std::vector< itk::SmartPointer<itk::ProcessObject> > savedPointers;
> but always got compile errors.
> I am confused when to use the smart-pointer as is and when with .GetPointer().
>
> According to
>
> https://cmake.org/pipermail/insight-users/2007-May/022374.html
> <https://cmake.org/pipermail/insight-users/2007-May/022374.html>
>
> I also tried storing the output-pointers (without pipe-line disconnection)
> in a separate list
>
> https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189
> <https://github.com/romangrothausmann/ITK-CLIs/commit/d9b5c3f1a786b595255a9153da9ceafd88d2a189>
>
> which does not compile either:
>
> resample.cxx:77:5: error: request for member ?GetPointer? in
> ?caster.itk::SmartPointer<TObjectType>::operator-><itk::CastImageFilter<itk::Image<float,
> 1u>, itk::Image<float, 1u> > >()->itk::CastImageFilter<itk::Image<float,
> 1u>, itk::Image<float, 1u>
> >::<anonymous>.itk::UnaryFunctorImageFilter<itk::Image<float, 1u>,
> itk::Image<float, 1u>, itk::Functor::Cast<float, float>
> >::<anonymous>.itk::InPlaceImageFilter<itk::Image<float, 1u>,
> itk::Image<float, 1u>
> >::<anonymous>.itk::ImageToImageFilter<itk::Image<float, 1u>,
> itk::Image<float, 1u>
> >::<anonymous>.itk::ImageSource<TOutputImage>::GetOutput<itk::Image<float,
> 1u> >()?, which is of pointer type ?itk::ImageSource<itk::Image<float, 1u>
> >::OutputImageType* {aka itk::Image<float, 1u>*}? (maybe you meant to use
> ?->? ?)
> savedOutPointers.push_back(caster->GetOutput().GetPointer());
> ^
>
> I'm wondering if construct as needed is not possible at all because I can't
> find anything like that in the ITK-sources or examples. For the code
> snippets I can find in the MLs it is not clear whether they got tested and
> were accepted by a compiler.
>
> Any further ideas?
>
> Best
> Roman
>
>
> On Fri, Sep 9, 2016 at 8:29 AM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>
> <mailto:grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>>>
> wrote:
>
> On 22/07/16 14:49, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>
> Hi,
>
> Who is holding the pointer to the newly created ImageFileReader
> outside of
> the loop? For that type of operation I’ll frequently just stash
> smart
> pointers into a std::vector or list.
>
>
> I tried to change the resample example
>
> (https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html
> <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html>
>
> <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html
> <https://itk.org/Doxygen/html/Examples_2Filtering_2ResampleVolumesToBeIsotropic_8cxx-example.html>>
> that uses itkRecursiveGaussianImageFilter for each dimension) such
> that it works
> for any dimensional image.
> Doing as Brad suggested and storing each smart-pointer of
> itkRecursiveGaussianImageFilter in a std::vector I get a program
>
> (https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx
> <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx>
>
> <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx
> <https://github.com/romangrothausmann/ITK-CLIs/blob/0968dd25af2abc37ffb0c0503cc4c2972b3b2098/resample.cxx>>)
> that compiles but segfaults when used. I guess the way I'm trying to
> dereference a pointer from the list is not correct
>
> (https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80
> <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80>
>
> <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80
> <https://github.com/romangrothausmann/ITK-CLIs/commit/0968dd25af2abc37ffb0c0503cc4c2972b3b2098#diff-cb1b1c6837c6074372c220250cfdbb36R80>>)
> but I could not find an example except the one referenced in the
> code line.
> So how to correctly dereference a pointer from the list of
> smart-pointers to
> get its output?
>
> Thank for any help or hints
> Roman
>
> On Jul 22, 2016, at 6:00 AM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>
> <mailto:grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>>> wrote:
>
> Many thanks Brad for Your detailed reply. I understand now
> the problems
> concerning streaming TileImageFilter. However I still wonder
> why my
> non-streaming version also does not work any more after
> moving the
> creation
> of reader instances into the for-loop:
>
> https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50
> <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50>
>
> <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50
> <https://github.com/romangrothausmann/ITK-CLIs/blob/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9/tile.cxx#L46-L50>>
>
>
>
> Is this construct inappropriate for the TileImageFilter?
>
> Why does it work for:
>
> https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>
>
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>>
>
>
>
> On 21/07/16 15:41, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>
> Hello,
>
> The TileImageFilter does not fully stream [1]. The
> filter also
> has some
> odd behavior, and other older implementation details. If
> you are
> going to
> work on a streaming pipelines it is best practice to
> examine the
> filters
> to determine how the Requested regions behave.
>
> However, there is no reason that the TileImageFilter
> algorithm
> couldn’t
> support streaming. It is just a matter of code and a
> bunch of
> testing. A
> contribution for this issue would be welcomed! Also this
> filter
> is in
> need a refactoring and bring it up to several other best
> practices. There
> are several issue with the current implementation that would
> cause it not
> to work correctly with a streaming pipeline, and cause
> excessive
> execution.
>
> You can also use the PipelieMoniotorImageFilter to
> record and
> print the
> pipeline interaction during Update [2]. This information
> helps with
> debugging and diagnosing problems, but if the pipeline is
> mis-behaving (
> as the TileImageFilter may ), the information may not be
> correct.
>
> I have tried similar streaming with the
> JoinSeriesImageFilter.
> However I
> ran into many problems with having hundreds of ImageIO being
> utilized at
> the same time. There were problems with having too many
> files
> open at the
> same time along with ImageIO libraries that couldn’t
> handle single
> threaded access to multiple files.
>
> [1]
>
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136
> <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136>
>
> <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136
> <https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkTileImageFilter.hxx#L125-L136>>
>
>
>
>
> [2]
> https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html
> <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html>
>
> <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html <https://itk.org/Doxygen/html/classitk_1_1PipelineMonitorImageFilter.html>>
>
>
> On Jul 21, 2016, at 6:41 AM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>
> <mailto:grothausmann.roman at mh-hannover.de
> <mailto:grothausmann.roman at mh-hannover.de>>> wrote:
>
> Dear mailing list members,
>
>
> Based on the examples for TileImageFilter I've created a
> working CLI
> to append an arbitrary number of inputs
>
> (https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx
> <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx>
>
> <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx
> <https://github.com/romangrothausmann/ITK-CLIs/blob/4fdf5778022598dcf83fb38e6002df72bd67bef3/tile.cxx>>).
>
>
>
>
> As there is an example that does not apply Update and
> DisconnectPipeline on
> the readers
>
> (https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>
>
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2
> <https://itk.org/Doxygen/html/SphinxExamples_2src_2Filtering_2ImageGrid_2AppendTwo3DVolumes_2Code_8cxx-example.html#_a2>>)
>
>
>
> I changed my code such that a reader instance is
> created for
> each input
> in a for-loop:
>
> https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9
> <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9>
>
> <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9
> <https://github.com/romangrothausmann/ITK-CLIs/commit/ebfc0aea37d28cbbf2bb22c3f56be52453cebde9>>
>
>
>
>
>
> However, the update from the writer seems not to propagate to the
> readers
> whether streaming or not. Can the TileImageFilter not stream in such
> a case
> or are further modifications necessary?
>
>
> Thanks for any help or hints Roman
>
>
> On 18/08/14 17:01, Michka Popoff wrote:
>
> Hi
>
> Going the way described in the CreateVolume
> example is
> the way to
> go.
>
> Why did you uncomment the DisconnectPipeline()
> call and
> Update() call
> in the for loop ? They need to stay there, else
> you will
> always use
> the last image. That’s why you see the same
> image, the
> single update
> call will be triggered at the end of the script
> and read
> only one
> image.
>
> You don’t need to call tileFilter->Update(), you can
> remove this
> line. The writer->Update() will take care of the
> pipeline update. As
> a bonus, you may wrap your writer->Update() call, to
> fetch errors at
> the end of the pipeline:
>
> try { writer->Update(); } catch(
> itk::ExceptionObject &
> error ) {
> std::cerr << "Error: " << error << std::endl; return
> EXIT_FAILURE; }
>
> I made a little Python prototype, the syntax is
> a little bit
> different than in C++ but it gives you the main
> idea.
>
> Michka
>
>
> -- Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung Tomography and
> Digital Image
> Analysis
>
> Institut für Funktionelle und Angewandte Anatomie,
> OE 4120
> Medizinische Hochschule Hannover Carl-Neuberg-Str. 1
> D-30625
> Hannover
>
> Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
> <tel:%2B49%20511%20532-2900>
> _____________________________________ Powered by
> www.kitware.com <http://www.kitware.com>
> <http://www.kitware.com>
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> <http://www.kitware.com/opensource/opensource.html>
> <http://www.kitware.com/opensource/opensource.html
> <http://www.kitware.com/opensource/opensource.html>>
>
> Kitware offers ITK Training Courses, for more
> information visit:
> http://www.kitware.com/products/protraining.php
> <http://www.kitware.com/products/protraining.php>
> <http://www.kitware.com/products/protraining.php
> <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
> <http://www.itk.org/Wiki/ITK_FAQ>
> <http://www.itk.org/Wiki/ITK_FAQ
> <http://www.itk.org/Wiki/ITK_FAQ>>
>
> Follow this link to subscribe/unsubscribe:
>
> http://public.kitware.com/mailman/listinfo/insight-users
> <http://public.kitware.com/mailman/listinfo/insight-users>
>
> <http://public.kitware.com/mailman/listinfo/insight-users
> <http://public.kitware.com/mailman/listinfo/insight-users>>
> _______________________________________________
> Community
> mailing list
> Community at itk.org <mailto:Community at itk.org>
> <mailto:Community at itk.org <mailto:Community at itk.org>>
> http://public.kitware.com/mailman/listinfo/community
> <http://public.kitware.com/mailman/listinfo/community>
>
> <http://public.kitware.com/mailman/listinfo/community
> <http://public.kitware.com/mailman/listinfo/community>>
>
>
>
> -- Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung Tomography and
> Digital Image
> Analysis
>
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische
> Hochschule Hannover Carl-Neuberg-Str. 1 D-30625 Hannover
>
> Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
> <tel:%2B49%20511%20532-2900>
>
>
>
> --
> Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung
> Tomography and Digital Image Analysis
>
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische Hochschule Hannover
> Carl-Neuberg-Str. 1
> D-30625 Hannover
>
> Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
> <tel:%2B49%20511%20532-2900>
> _____________________________________
> Powered by www.kitware.com <http://www.kitware.com>
> <http://www.kitware.com>
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> <http://www.kitware.com/opensource/opensource.html>
> <http://www.kitware.com/opensource/opensource.html
> <http://www.kitware.com/opensource/opensource.html>>
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
> <http://www.kitware.com/products/protraining.php>
> <http://www.kitware.com/products/protraining.php
> <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 <http://www.itk.org/Wiki/ITK_FAQ>
> <http://www.itk.org/Wiki/ITK_FAQ <http://www.itk.org/Wiki/ITK_FAQ>>
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/insight-users
> <http://public.kitware.com/mailman/listinfo/insight-users>
> <http://public.kitware.com/mailman/listinfo/insight-users
> <http://public.kitware.com/mailman/listinfo/insight-users>>
>
>
>
> --
> Dr. Roman Grothausmann
>
> Tomographie und Digitale Bildverarbeitung
> Tomography and Digital Image Analysis
>
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische Hochschule Hannover
> Carl-Neuberg-Str. 1
> D-30625 Hannover
>
> Tel. +49 511 532-2900 <tel:%2B49%20511%20532-2900>
>
>
--
Dr. Roman Grothausmann
Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis
Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover
Tel. +49 511 532-2900
More information about the Insight-users
mailing list