nouveau fichier : include/Appli/Option.hpp
nouveau fichier : src/Appli/Option.cpp
This commit is contained in:
parent
4b4bbe889d
commit
eb0e4b26cb
37
include/Appli/Option.hpp
Normal file
37
include/Appli/Option.hpp
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef _OTB_TRISKELE_OPTION_HPP
|
||||
#define _OTB_TRISKELE_OPTION_HPP
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
#include "triskeleBase.hpp"
|
||||
#include "IImage.hpp"
|
||||
|
||||
namespace otb {
|
||||
namespace triskele {
|
||||
using namespace ::triskele;
|
||||
|
||||
// ========================================
|
||||
|
||||
class Option {
|
||||
public:
|
||||
bool debugFlag;
|
||||
IImage inputImage;
|
||||
IImage outputImage;
|
||||
Point topLeft = NullPoint;
|
||||
Size size = NullSize;
|
||||
DimChanel chanel = 0;
|
||||
unsigned int treeCoreCount = boost::thread::hardware_concurrency ();
|
||||
|
||||
Option ();
|
||||
Option (int argc, char** argv);
|
||||
|
||||
void usage (string msg = "", bool hidden = false);
|
||||
void parse (int argc, char** argv);
|
||||
};
|
||||
|
||||
}//namespace triskele
|
||||
}//namespace otb
|
||||
|
||||
#endif //_OTB_TRISKELE_OPTION_HPP
|
||||
183
src/Appli/Option.cpp
Normal file
183
src/Appli/Option.cpp
Normal file
@ -0,0 +1,183 @@
|
||||
#define LAST_VERSION "2018-02-17 (Debian Stretch)"
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
|
||||
#include <boost/program_options/options_description.hpp>
|
||||
#include <boost/program_options/variables_map.hpp>
|
||||
#include <boost/program_options/parsers.hpp>
|
||||
|
||||
#include "triskeleDebug.hpp"
|
||||
#include "triskeleBase.hpp"
|
||||
#include "IImage.hpp"
|
||||
#include "Appli/Option.hpp"
|
||||
|
||||
#ifndef TRISKELE_ERROR
|
||||
#define TRISKELE_ERROR(expr) std::cerr << expr << std::endl << std::flush, std::exit (1)
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
using namespace triskele;
|
||||
using namespace otb::triskele;
|
||||
|
||||
// ========================================
|
||||
Option::Option () {
|
||||
}
|
||||
|
||||
Option::Option (int argc, char** argv) {
|
||||
parse (argc, argv);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
namespace po = boost::program_options;
|
||||
po::options_description desc ("Allowed options");
|
||||
po::options_description hide ("Hidded options");
|
||||
char *prog = NULL;
|
||||
|
||||
// ========================================
|
||||
void
|
||||
Option::usage (string msg, bool hidden) {
|
||||
if (!msg.empty ())
|
||||
cout << msg << endl;
|
||||
cout << endl
|
||||
<<"Usage: " << endl
|
||||
<<" " << prog << " [options] [-i] inputFileName [-o] outputFileName" << endl << endl
|
||||
<< endl << desc << endl;
|
||||
if (hidden)
|
||||
cout << hide << endl;
|
||||
exit (1);
|
||||
}
|
||||
|
||||
void
|
||||
version () {
|
||||
cout << endl << prog << " version " << LAST_VERSION << endl << endl
|
||||
<< " GDAL : read and write image (http://www.gdal.org/)" << endl
|
||||
<< " cct : inspired by jirihavel library to build trees (https://github.com/jirihavel/libcct)" << endl
|
||||
<< " Boost : C++ libraries (http://www.boost.org/)" << endl
|
||||
<< endl << " This software is a Obelix team production (http://www-obelix.irisa.fr/)" << endl << endl;
|
||||
exit (0);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
static const string inputFile = "input-file";
|
||||
static const char *const inputFileC = inputFile.c_str ();
|
||||
|
||||
void
|
||||
Option::parse (int argc, char** argv) {
|
||||
prog = argv [0];
|
||||
bool helpFlag = false, versionFlag = false, useTheForceLuke = false;
|
||||
string inputFileName, outputFileName;
|
||||
long left = -1, top = -1, width = -1, height = -1;
|
||||
try {
|
||||
desc.add_options ()
|
||||
("help", po::bool_switch (&helpFlag), "produce this help message")
|
||||
("version", po::bool_switch (&versionFlag), "display version information")
|
||||
("debug", po::bool_switch (&debugFlag), "debug mode")
|
||||
("band,b", po::value<DimChanel> (&chanel), (string ("select input band (first band is 0) (default ")+
|
||||
boost::lexical_cast<std::string> (chanel)+")").c_str ())
|
||||
("left,x", po::value<long> (&left), "left crop (default center)")
|
||||
("top,y", po::value<long> (&top), "top crop (default middle)")
|
||||
("width,w", po::value<long> (&width), "width crop (default input width)")
|
||||
("height,h", po::value<long> (&height), "height crop (default input height)")
|
||||
("input,i", po::value<string> (&inputFileName), "input file name image")
|
||||
("output,o", po::value<string> (&outputFileName), "output file name hyperbands image (contains attributs profiles)")
|
||||
//("min-tree", po::bool_switch (&options.noTreeFlag[minE]), "build min-tree")
|
||||
//("area,A", po::value<string> (&areaThresholdsName), "produce area attributs")
|
||||
;
|
||||
hide.add_options ()
|
||||
("use-the-force-luke", po::bool_switch (&useTheForceLuke), "display hidded options")
|
||||
("tree-core-count", po::value<unsigned int> (&treeCoreCount), "thread used to build tree (default hardware value)")
|
||||
// ("max-tree", po::bool_switch (&options.noTreeFlag[maxE]), "build max-tree")
|
||||
// ("tos-tree", po::bool_switch (&options.noTreeFlag[tosE]), "build tree-of-shape")
|
||||
// ("standard-deviation,S", po::value<string> (&sdThresholdsName), "produce standard deviation attributs")
|
||||
// ("moment-of-inertia,I", po::value<string> (&moiThresholdsName), "produce moment of inertia attributs")
|
||||
// ("no-border", po::bool_switch (&options.noBorder), "build tree with all pixels (included no-data)")
|
||||
// ("dap", po::bool_switch (&options.dapFlag), "produce DAP rather than AP")
|
||||
// ("use-all-orig", po::bool_switch (&options.useAllOrigFlag), "force use all original band")
|
||||
// ("dap-no-orig", po::bool_switch (&options.dapNoOrigFlag), "force don't use original AP band")
|
||||
// ("dap-orig-pos", po::value<unsigned int> (&apOrigPos), (string ("position of origin on DAP (default ")+
|
||||
// boost::lexical_cast<std::string> (apOrigPos)+
|
||||
// " = "+apOrigPosName [apOrigPos]+")").c_str ())
|
||||
// ("dap-orig-weight", po::bool_switch (&options.dapOrigWeightFlag), "use origin weight for dap")
|
||||
;
|
||||
|
||||
po::options_description cmd ("All options");
|
||||
cmd.add (desc).add (hide).add_options ()
|
||||
(inputFileC, po::value<vector<string> > (), "input thresholds output")
|
||||
;
|
||||
|
||||
po::positional_options_description p;
|
||||
p.add (inputFileC, -1);
|
||||
po::variables_map vm;
|
||||
po::store (po::command_line_parser (argc, argv).options (cmd).positional (p).run (), vm);
|
||||
po::store (po::command_line_parser (argc, argv).options (desc).positional (p).run (), vm);
|
||||
po::notify (vm);
|
||||
|
||||
if (useTheForceLuke)
|
||||
usage ("", true);
|
||||
if (versionFlag)
|
||||
version ();
|
||||
if (helpFlag)
|
||||
usage ();
|
||||
|
||||
int required = 2;
|
||||
if (vm.count ("input"))
|
||||
required--;
|
||||
if (vm.count ("output"))
|
||||
required--;
|
||||
|
||||
int nbArgs = 0;
|
||||
if (vm.count (inputFileC))
|
||||
nbArgs = vm[inputFileC].as<vector<string> > ().size ();
|
||||
if (required-nbArgs != 0)
|
||||
usage ("Need one input and one output");
|
||||
if (required) {
|
||||
vector<string> var = vm[inputFileC].as<vector<string> > ();
|
||||
if (outputFileName.empty ())
|
||||
outputFileName = var [--required];
|
||||
if (inputFileName.empty ())
|
||||
inputFileName = var [--required];
|
||||
}
|
||||
|
||||
if (debugFlag) {
|
||||
#ifndef ENABLE_LOG
|
||||
cout << "No debug option available. You must compile without: -DENABLE_LOG" << endl;
|
||||
#endif
|
||||
debug = true;
|
||||
}
|
||||
|
||||
} catch (...) {
|
||||
usage ("Bad options");
|
||||
}
|
||||
inputImage.setFileName (inputFileName);
|
||||
outputImage.setFileName (outputFileName);
|
||||
inputImage.readImage ();
|
||||
|
||||
GDALDataType inputType = inputImage.getDataType ();
|
||||
|
||||
int bandInputCount = inputImage.getBandCount ();
|
||||
if (!(chanel < bandInputCount))
|
||||
TRISKELE_ERROR ("chanel " << chanel << " out of " << bandInputCount << " bands!");
|
||||
|
||||
Size orgSize = inputImage.getSize ();
|
||||
if (width < 0 || width > orgSize.width)
|
||||
width = left <= 0 ? orgSize.width : min (1L, orgSize.width-left);
|
||||
if (height < 0 || height > orgSize.height)
|
||||
height = top <= 0 ? orgSize.height : min (1L, orgSize.height-top);
|
||||
if (left < 0)
|
||||
left = (orgSize.width - width)/2;
|
||||
if (top < 0)
|
||||
top = (orgSize.height - height)/2;
|
||||
if (left > orgSize.width - width)
|
||||
left = orgSize.width - width;
|
||||
if (top > orgSize.height - height)
|
||||
top = orgSize.height - height;
|
||||
topLeft = Point ((DimSideImg) left, (DimSideImg) top);
|
||||
size = Size ((DimSideImg) width, (DimSideImg) height);
|
||||
|
||||
cout
|
||||
<< "Input :" << inputFileName << " " << orgSize << " (" << bandInputCount << " chanels of " << GDALGetDataTypeName (inputType) << ")" << endl
|
||||
<< "Crop topLeft:" << topLeft << " size:" << size << " band:" << chanel << endl
|
||||
<< "Output :" << outputFileName << endl;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user