int main(int argc, char** argv) { // parse command line ---------------------------------------------- po::options_description general_opt("Allowed options are: "); general_opt.add_options() ("help,h", "display this message") ("input,i", po::value<std::string>(), "input image file name (any 2D image format accepted by DGtal::GenericReader)") ("output,o", po::value<std::string>(), "output image file name (any 2D image format accepted by DGtal::GenericWriter)") ("angle,a", po::value<double>()->default_value(0.0), "Angle in radian") ; bool parseOK=true; po::variables_map vm; try{ po::store(po::parse_command_line(argc, argv, general_opt), vm); }catch(const std::exception& ex){ trace.info()<< "Error checking program options: "<< ex.what()<< std::endl; parseOK=false; } po::notify(vm); if(vm.count("help")||argc<=1|| !parseOK) { trace.info()<< "Rotate an image by a given angle a binary object with 0 values as background points and values >0 for the foreground ones." <<std::endl << "Basic usage: "<<std::endl << "\t imgRotate [options] --input <imageName> --output <outputImage> --angle 0.3"<<std::endl << general_opt << "\n"; return 0; } //Parameters if ( ! ( vm.count ( "input" ) ) ) missingParam ( "--input" ); const std::string input = vm["input"].as<std::string>(); if ( ! ( vm.count ( "output" ) ) ) missingParam ( "--output" ); const std::string output = vm["output"].as<std::string>(); const double angle = vm["angle"].as<double>(); typedef functors::IntervalForegroundPredicate<MyImage> Binarizer; MyImage image = GenericReader<MyImage>::import( input ); trace.info() <<"Input image: "<< image<<std::endl; typedef functors::BackwardRigidTransformation2D<Z2i::Space> RotateFunctor; Z2i::RealPoint center = image.domain().upperBound(); center -= image.domain().lowerBound(); center /= 2.0; RotateFunctor rotationFunctor(center, angle, Z2i::RealPoint(0.0,0.0)); functors::Identity idD; typedef functors::DomainRigidTransformation2D<MyImage::Domain, RotateFunctor> MyDomainTransformer; MyDomainTransformer rotDomain(rotationFunctor); typedef MyDomainTransformer::Bounds Bounds; Bounds newdomain = rotDomain( image.domain()); MyImage::Domain transformedDomain ( newdomain.first, newdomain.second ); typedef ConstImageAdapter<MyImage, MyImage::Domain, RotateFunctor, MyImage::Value, functors::Identity > MyImageBackwardAdapter; MyImageBackwardAdapter backwardImageAdapter ( image, transformedDomain , rotationFunctor, idD ); backwardImageAdapter >> output; return 0; }