DGtalTools  0.9.3
rigidTransform2D.cpp
1 
28 #include <iostream>
29 #include <DGtal/base/Common.h>
30 #include <DGtal/io/readers/GenericReader.h>
31 #include <DGtal/io/writers/GenericWriter.h>
32 #include <DGtal/helpers/StdDefs.h>
33 #include <DGtal/images/Image.h>
34 #include <DGtal/images/ImageSelector.h>
35 #include <DGtal/images/ConstImageAdapter.h>
36 #include <DGtal/images/RigidTransformation2D.h>
37 
38 #include <boost/program_options/options_description.hpp>
39 #include <boost/program_options/parsers.hpp>
40 #include <boost/program_options/variables_map.hpp>
41 
42 using namespace std;
43 using namespace DGtal;
44 using namespace Z2i;
45 using namespace functors;
46 
47 namespace po = boost::program_options;
48 
49 
55 void missingParam ( std::string param )
56 {
57  trace.error() <<" Parameter: "<<param<<" is required..";
58  trace.info() <<std::endl;
59  exit ( 1 );
60 }
61 
62 
63 int main(int argc, char**argv)
64 {
65 
66  // parse command line ----------------------------------------------
67  po::options_description general_opt ( "Allowed options are: " );
68  general_opt.add_options()
69  ( "help,h", "display this message." )
70  ( "input,i", po::value<std::string>(), "Input file." )
71  ( "output,o", po::value<string>(),"Output filename." )
72  ( "model,m", po::value<string>(),"Transformation model: backward, forward." )
73  ( "angle,a", po::value<double>(),"Rotation angle in radians." )
74  ( "ox", po::value<double>(),"X coordinate of origin." )
75  ( "oy", po::value<double>(),"Y coordinate of origin." )
76  ( "tx", po::value<double>(),"X component of translation vector." )
77  ( "ty", po::value<double>(),"Y component of translation vector." );
78 
79  bool parseOK=true;
80  po::variables_map vm;
81  try{
82  po::store(po::parse_command_line(argc, argv, general_opt), vm);
83  }catch(const std::exception& ex){
84  parseOK=false;
85  trace.info()<< "Error checking program options: "<< ex.what()<< endl;
86  }
87 
88  po::notify ( vm );
89  if (!parseOK || vm.count ( "help" ) ||argc<=1 )
90  {
91  trace.info() << "Rotate 2D image."<<std::endl
92  << std::endl << "Basic usage: "<<std::endl
93  << "rigidTrans2D --ox 1.0 --oy 1.0 -a 1.2 --tx 1 --ty 0 --m <forward|backward> --input <RawFileName> --output <VolOutputFileName> "<<std::endl
94  << general_opt << "\n";
95  return 0;
96  }
97 
98  //Parse options
99  if ( ! ( vm.count ( "input" ) ) ) missingParam ( "--input" );
100  std::string filename = vm["input"].as<std::string>();
101  if ( ! ( vm.count ( "output" ) ) ) missingParam ( "--output" );
102  std::string outputFileName = vm["output"].as<std::string>();
103  if ( ! ( vm.count ( "model" ) ) ) missingParam ( "--model" );
104  std::string model = vm["model"].as<std::string>();
105  if ( ! ( vm.count ( "angle" ) ) ) missingParam ( "--angle" );
106  double angle = vm["angle"].as<double>();
107  if ( ! ( vm.count ( "ox" ) ) ) missingParam ( "--ox" );
108  double ox = vm["ox"].as<double>();
109  if ( ! ( vm.count ( "oy" ) ) ) missingParam ( "--oy" );
110  double oy = vm["oy"].as<double>();
111  if ( ! ( vm.count ( "tx" ) ) ) missingParam ( "--tx" );
112  double tx = vm["tx"].as<double>();
113  if ( ! ( vm.count ( "ty" ) ) ) missingParam ( "--ty" );
114  double ty = vm["ty"].as<double>();
115 
116  typedef ImageSelector<Domain, unsigned char >::Type Image;
117  typedef ForwardRigidTransformation2D < Space > ForwardTrans;
118  typedef BackwardRigidTransformation2D < Space > BackwardTrans;
119  typedef ConstImageAdapter<Image, Domain, BackwardTrans, Image::Value, Identity > MyImageBackwardAdapter;
120  typedef DomainRigidTransformation2D < Domain, ForwardTrans > MyTransformedDomain;
121  typedef MyTransformedDomain::Bounds Bounds;
122 
123  Image image = GenericReader <Image, 2>::import(filename);
124  ForwardTrans forwardTrans( RealPoint ( ox, oy ), angle, RealVector( tx, ty ) );
125  BackwardTrans backwardTrans( RealPoint ( ox, oy ), angle, RealVector( tx, ty ) );
126  MyTransformedDomain domainForwardTrans ( forwardTrans );
127  Bounds bounds = domainForwardTrans ( image.domain() );
128  Domain transformedDomain ( bounds.first, bounds.second );
129  Identity idD;
130 
131  if ( model == "forward" )
132  {
133  Image forwardTransformedImage ( transformedDomain );
134  for ( Domain::ConstIterator it = image.domain().begin(); it != image.domain().end(); ++it )
135  {
136  forwardTransformedImage.setValue ( forwardTrans ( *it ), image ( *it ) );
137  }
138  GenericWriter<Image, 2, unsigned char, Identity>::exportFile(outputFileName, forwardTransformedImage, idD);
139  }
140  else
141  {
142  MyImageBackwardAdapter backwardImageAdapter ( image, transformedDomain , backwardTrans, idD );
143  GenericWriter<MyImageBackwardAdapter, 2, unsigned char, Identity>::exportFile(outputFileName, backwardImageAdapter, idD);
144  }
145  return 0;
146 }
STL namespace.
Definition: ATu0v1.h:56