]> Creatis software - cpPlugins.git/blob - appli/examples/example_ViewImageThreshold.cxx
85796afd3b4553689011883107d34d0675767e61
[cpPlugins.git] / appli / examples / example_ViewImageThreshold.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <sstream>
4 #include <string>
5 #include <vector>
6
7 #include <vtkRenderer.h>
8 #include <vtkRenderWindow.h>
9 #include <vtkRenderWindowInteractor.h>
10
11 #include <cpPlugins/Interface/Plugins.h>
12 #include <cpPlugins/Interface/Image.h>
13
14 #include <cpExtensions/Visualization/ImageSliceActors.h>
15
16 // -------------------------------------------------------------------------
17 typedef cpPlugins::Interface::Plugins                 TPlugins;
18 typedef cpPlugins::Interface::Image                   TImage;
19 typedef cpExtensions::Visualization::ImageSliceActors TSliceActors;
20
21 // -------------------------------------------------------------------------
22 int main( int argc, char* argv[] )
23 {
24   if( argc < 9 )
25   {
26     std::cerr
27       << "Usage: " << argv[ 0 ]
28       << " plugins_file input_image"
29       << " lower1 upper1 lower2 upper2 lower3 upper3"
30       << std::endl;
31     return( 1 );
32
33   } // fi
34   std::string plugins_file = argv[ 1 ];
35   std::string input_image_file = argv[ 2 ];
36   double lower[ 3 ], upper[ 3 ];
37   lower[ 0 ] = std::atof( argv[ 3 ] );
38   upper[ 0 ] = std::atof( argv[ 4 ] );
39   lower[ 1 ] = std::atof( argv[ 5 ] );
40   upper[ 1 ] = std::atof( argv[ 6 ] );
41   lower[ 2 ] = std::atof( argv[ 7 ] );
42   upper[ 2 ] = std::atof( argv[ 8 ] );
43
44   // Load plugins
45   cpPlugins::Interface::Plugins plugins;
46   if( !plugins.LoadPluginsPath( plugins_file ) )
47   {
48     std::cerr << "Failed to load plugins." << std::endl;
49     return( 1 );
50
51   } // fi
52
53   // Read image
54   std::string image_name = "";
55   try
56   {
57     image_name = plugins.ReadImage( input_image_file, "" );
58   }
59   catch( std::exception& err )
60   {
61     std::cerr << err.what( ) << std::endl;
62     return( 1 );
63
64   } // yrt
65
66   // Apply three a two-level threshold
67   std::vector< std::string > thresholds_names;
68   std::string filter_name =
69     "cpPlugins::BasicFilters::BinaryThresholdImageFilter";
70   for( int i = 0; i < 3; ++i )
71   {
72     if( !( plugins.ActivateFilter( filter_name ) ) )
73     {
74       std::cerr << "No filter found" << std::endl;
75       return( 1 );
76
77     } // fi
78
79     // Connect inputs
80     TPlugins::TStringContainer input_names;
81     plugins.GetActiveFilterInputsNames( input_names );
82     for( auto iIt = input_names.begin( ); iIt != input_names.end( ); ++iIt )
83       plugins.ConnectInputInActiveFilter( image_name, *iIt );
84
85     // Configure
86     TPlugins::TParameters* filter_params = plugins.GetActiveFilterParameters( );
87     filter_params->SetReal( "LowerThresholdValue", lower[ i ] );
88     filter_params->SetReal( "UpperThresholdValue", upper[ i ] );
89     filter_params->SetUint( "InsideValue", i + 10 );
90     filter_params->SetUint( "OutsideValue", 0 );
91
92     // Configure outputs
93     TPlugins::TStringContainer output_names;
94     plugins.GetActiveFilterOutputsNames( output_names );
95
96     std::stringstream obj_name_str;
97     obj_name_str << "output_" << i;
98     plugins.SetOutputNameInActiveFilter(
99       obj_name_str.str( ),
100       *( output_names.begin( ) )
101       );
102
103     // Execute
104     output_names.clear( );
105     try
106     {
107       if( !( plugins.UpdateActiveFilter( output_names, image_name ) ) )
108       {
109         std::cerr << "Error executing filter." << std::endl;
110         return( 1 );
111
112       } // fi
113     }
114     catch( std::exception& err )
115     {
116       std::cerr << err.what( ) << std::endl;
117       return( 1 );
118
119     } // yrt
120     thresholds_names.push_back( *( output_names.begin( ) ) );
121
122     plugins.DeactivateFilter( );
123
124   } // rof
125   
126   // Get both images
127   TImage* image = plugins.GetData< TImage >( image_name );
128   TImage* thr0 = plugins.GetData< TImage >( thresholds_names[ 0 ] );
129   TImage* thr1 = plugins.GetData< TImage >( thresholds_names[ 1 ] );
130   TImage* thr2 = plugins.GetData< TImage >( thresholds_names[ 2 ] );
131
132   // Configure visualization objects
133   vtkSmartPointer< vtkRenderer > renderer =
134     vtkSmartPointer< vtkRenderer >::New( );
135   renderer->SetBackground( 0.3, 0.3, 0.3 );
136
137   vtkSmartPointer< vtkRenderWindow > window =
138     vtkSmartPointer< vtkRenderWindow >::New( );
139   window->AddRenderer( renderer );
140   window->SetSize( 600, 600 );
141
142   // Set up the interaction
143   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
144     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
145   window->SetInteractor( interactor );
146
147   // Create slice actors
148   vtkSmartPointer< TSliceActors > image_actors =
149     vtkSmartPointer< TSliceActors >::New( );
150   image_actors->SetInputImage( image->GetVTK< vtkImageData >( ) );
151   image_actors->AddBinaryImage( thr0->GetVTK< vtkImageData >( ), 1, 0, 0 );
152   image_actors->AddBinaryImage( thr1->GetVTK< vtkImageData >( ), 0, 1, 0 );
153   image_actors->AddBinaryImage( thr2->GetVTK< vtkImageData >( ), 0, 0, 1 );
154   image_actors->SetAxis( 2 );
155   image_actors->PushActorsInto( window );
156
157   // Begin interaction
158   renderer->ResetCamera( );
159   window->Render( );
160   interactor->Start( );
161
162   return( 0 );
163 }
164
165 // eof - $RCSfile$