Mercurial Hosting > traffic-intelligence
diff c/Parameters.cpp @ 137:445e773c9be3
created the parameter structure to parse parameters (bug remaining)
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Fri, 19 Aug 2011 01:35:45 -0400 |
parents | |
children | 6f10a227486c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c/Parameters.cpp Fri Aug 19 01:35:45 2011 -0400 @@ -0,0 +1,110 @@ +#include "Parameters.hpp" + +#include <boost/program_options.hpp> + +#include <iostream> +#include <fstream> + +namespace po = boost::program_options; +using namespace std; + +KLTFeatureTrackingParameters::KLTFeatureTrackingParameters(const int argc, char* argv[]) { + std::string configurationFilename; + po::options_description onlyCmdLine("Command line only"); + po::options_description cmdLineAndFile("Command line and configuration file"); + + // configuration filename + onlyCmdLine.add_options() + ("config-file", po::value<string>(&configurationFilename)->default_value("tracking.cfg"), "configuration file") + ; + + po::positional_options_description p; + p.add("config-file", 1); + + // common to cnnfiguration and command line + cmdLineAndFile.add_options() + ("help,h", "displays this help message") + ("video-filename", po::value<string>(&videoFilename), "filename of the video to process") + ("database-filename", po::value<string>(&databaseFilename), "filename of the database where results are saved") + ("homography-filename", po::value<string>(&homographyFilename), "filename of the homography matrix") + ("mask-filename", po::value<string>(&maskFilename), "filename of the mask image (where features are detected)") + ("load-features", po::value<bool>(&loadFeatures), "load features from database") + ("display", po::value<bool>(&display), "display trajectories on the video") + ("video-fps", po::value<float>(&videoFPS), "original video frame rate") + ("frame1", po::value<int>(&frame1), "first frame to process") + ("nframes", po::value<int>(&nFrames), "number of frame to process") + // feature tracking + ("max-nfeatures", po::value<int>(&maxNFeatures), "maximum number of features added at each frame") + ("feature-quality", po::value<float>(&featureQuality), "quality level of the good features to track") + ("min-feature-distanceklt", po::value<float>(&minFeatureDistanceKLT), "minimum distance between features") + ("window-size", po::value<int>(&windowSize), "size of the search window at each pyramid level") + ("use-harris-detector", po::value<bool>(&useHarrisDetector), "use of Harris corner detector") + ("k", po::value<float>(&k), "k parameter to detect good features to track (OpenCV)") + ("pyramid-level", po::value<int>(&pyramidLevel), "maximal pyramid level in the feature tracking algorithm") + ("ndisplacements", po::value<unsigned int>(&nDisplacements), "number of displacement to test minimum feature motion") + ("min-feature-displacement", po::value<float>(&minFeatureDisplacement), "minimum displacement to keep features") + ("acceleration-bound", po::value<float>(&accelerationBound), "maximum feature acceleration") + ("deviation-bound", po::value<float>(&deviationBound), "maximum feature deviation") + ("nframes-smoothing", po::value<int>(&nFramesSmoothing), "number of frames to smooth positions (half window)") + ("max-number-iterations", po::value<int>(&maxNumberTrackingIterations), "maximum number of iterations to stop feature tracking") + ("min-tracking-error", po::value<float>(&minTrackingError), "minimum error to reach to stop feature tracking") + ("min-feature-time", po::value<unsigned int>(&minFeatureTime), "minimum length of a feature (number of frames) to consider a feature for grouping") + ("mm-connection-distance", po::value<float>(&mmConnectionDistance), "connection distance in feature grouping") + ("mm-segmentation-distance", po::value<float>(&mmSegmentationDistance), "segmentation distance in feature grouping") + ("max-distance", po::value<float>(&maxDistance), "maximum distance between features for grouping") + ("min-velocity-cosine", po::value<float>(&minVelocityCosine), "minimum cosine of the angle between the velocity vectors for grouping") + ("min-nfeatures-group", po::value<int>(&minNFeaturesPerGroup), "minimum average number of features per frame to create a vehicle hypothesis") + ; + // ("max-uturn-cosine", po::value<float>(&maxUTurnCosine), "maximum cosine value to detect U-turn") + // ("nframes-avoid-uturn", po::value<int>(&nFramesAvoidUTurn), "number of frames over which a feature should not make a U-turn") + + + po::options_description cmdLine; + cmdLine.add(onlyCmdLine).add(cmdLineAndFile); + try { + po::variables_map vm; + store(po::command_line_parser(argc, argv). + options(cmdLine).positional(p).allow_unregistered().run(), vm); + notify(vm); + + if (vm.count("help")) { + cout << cmdLine << endl; + // cout << "Positional options:"; + // for (unsigned int i=0; i<p.max_total_count(); i++) + // cout << " " << p.name_for_position(i); + // cout << endl; + exit(0); + } + cout << "Using configuration file " << configurationFilename << endl; + + ifstream configurationFile(configurationFilename.c_str()); + store(po::parse_config_file(configurationFile, cmdLineAndFile), vm); + notify(vm); + + parameterDescription = getParameterDescription(cmdLine, vm); + } catch(exception& e) { + cout << e.what() << endl; + } +} + +string KLTFeatureTrackingParameters::getParameterDescription(po::options_description& options, const po::variables_map& vm, const string& separator /* = " " */) const { + stringstream stream; + vector<boost::shared_ptr<po::option_description> > optionsVec = options.options(); + for (unsigned int i=0; i<optionsVec.size(); ++i) { + boost::any value = vm[optionsVec[i]->long_name()].value(); + if (value.type() == typeid(bool)) + stream << boost::any_cast<bool>(value) << separator; + else if (value.type() == typeid(int)) + stream << boost::any_cast<int>(value) << separator; + else if (value.type() == typeid(unsigned int)) + stream << boost::any_cast<unsigned int>(value) << separator; + else if (value.type() == typeid(float)) + stream << boost::any_cast<float>(value) << separator; + else if (value.type() == typeid(string)) + stream << boost::any_cast<string>(value) << separator; + else + cerr << "the type of the option variable " << i << " is not int, float or string." << endl; + } + + return stream.str(); +}