diff --git a/modules/core/include/opencv2/core/utility.hpp b/modules/core/include/opencv2/core/utility.hpp index 7e89dc28e6..22011ddd2f 100644 --- a/modules/core/include/opencv2/core/utility.hpp +++ b/modules/core/include/opencv2/core/utility.hpp @@ -619,6 +619,10 @@ For example: } @endcode +Note that there are no default values for `help` and `timestamp` so we can check their presence using the `has()` method. +Arguments with default values are considered to be always present. Use the `get()` method in these cases to check their +actual value instead. + ### Usage For the described keys: @@ -630,7 +634,7 @@ For the described keys: # Bad call $ ./app -fps=aaa ERRORS: - Exception: can not convert: [aaa] to [double] + Parameter 'fps': can not convert: [aaa] to [double] @endcode */ class CV_EXPORTS CommandLineParser diff --git a/modules/core/src/command_line_parser.cpp b/modules/core/src/command_line_parser.cpp index 2753ef30a4..a7c1edc69f 100644 --- a/modules/core/src/command_line_parser.cpp +++ b/modules/core/src/command_line_parser.cpp @@ -97,23 +97,28 @@ void CommandLineParser::getByName(const String& name, bool space_delete, int typ { for (size_t j = 0; j < impl->data[i].keys.size(); j++) { - if (name.compare(impl->data[i].keys[j]) == 0) + if (name == impl->data[i].keys[j]) { String v = impl->data[i].def_value; if (space_delete) v = impl->cat_string(v); + + // it is an error if we just got the default value here + if(v.empty()) + break; + from_str(v, type, dst); return; } } } impl->error = true; - impl->error_message = impl->error_message + "Unknown parameter " + name + "\n"; + impl->error_message = impl->error_message + "Missing parameter: '" + name + "'\n"; } - catch (std::exception& e) + catch (Exception& e) { impl->error = true; - impl->error_message = impl->error_message + "Exception: " + String(e.what()) + "\n"; + impl->error_message = impl->error_message + "Parameter '"+ name + "': " + e.err + "\n"; } } @@ -128,17 +133,22 @@ void CommandLineParser::getByIndex(int index, bool space_delete, int type, void* { String v = impl->data[i].def_value; if (space_delete == true) v = impl->cat_string(v); + + // it is an error if we just got the default value here + if(v.empty()) + break; + from_str(v, type, dst); return; } } impl->error = true; - impl->error_message = impl->error_message + "Unknown parameter #" + format("%d", index) + "\n"; + impl->error_message = impl->error_message + "Missing parameter #" + format("%d", index) + "\n"; } - catch(std::exception & e) + catch(Exception& e) { impl->error = true; - impl->error_message = impl->error_message + "Exception: " + String(e.what()) + "\n"; + impl->error_message = impl->error_message + format("Parameter #%d: ", index) + e.err + "\n"; } } @@ -324,9 +334,9 @@ bool CommandLineParser::has(const String& name) const { for (size_t j = 0; j < impl->data[i].keys.size(); j++) { - if (name.compare(impl->data[i].keys[j]) == 0 && String("true").compare(impl->data[i].def_value) == 0) + if (name == impl->data[i].keys[j]) { - return true; + return !impl->cat_string(impl->data[i].def_value).empty(); } } } diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index ef8f0af9a0..c9e872b4c5 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -783,7 +783,7 @@ void TestBase::Init(const std::vector & availableImpls, ; cv::CommandLineParser args(argc, argv, command_line_keys); - if (args.has("help")) + if (args.get("help")) { args.printMessage(); return; @@ -791,7 +791,7 @@ void TestBase::Init(const std::vector & availableImpls, ::testing::AddGlobalTestEnvironment(new PerfEnvironment); - param_impl = args.has("perf_run_cpu") ? "plain" : args.get("perf_impl"); + param_impl = args.get("perf_run_cpu") ? "plain" : args.get("perf_impl"); std::string perf_strategy = args.get("perf_strategy"); if (perf_strategy == "default") { @@ -816,24 +816,24 @@ void TestBase::Init(const std::vector & availableImpls, param_seed = args.get("perf_seed"); param_time_limit = std::max(0., args.get("perf_time_limit")); param_force_samples = args.get("perf_force_samples"); - param_write_sanity = args.has("perf_write_sanity"); - param_verify_sanity = args.has("perf_verify_sanity"); + param_write_sanity = args.get("perf_write_sanity"); + param_verify_sanity = args.get("perf_verify_sanity"); #ifndef WINRT - test_ipp_check = !args.has("perf_ipp_check") ? getenv("OPENCV_IPP_CHECK") != NULL : true; + test_ipp_check = !args.get("perf_ipp_check") ? getenv("OPENCV_IPP_CHECK") != NULL : true; #else test_ipp_check = false; #endif param_threads = args.get("perf_threads"); #ifdef CV_COLLECT_IMPL_DATA - param_collect_impl = args.has("perf_collect_impl"); + param_collect_impl = args.get("perf_collect_impl"); #endif #ifdef ANDROID param_affinity_mask = args.get("perf_affinity_mask"); log_power_checkpoints = args.has("perf_log_power_checkpoints"); #endif - bool param_list_impls = args.has("perf_list_impls"); + bool param_list_impls = args.get("perf_list_impls"); if (param_list_impls) { @@ -861,7 +861,7 @@ void TestBase::Init(const std::vector & availableImpls, #ifdef HAVE_CUDA - bool printOnly = args.has("perf_cuda_info_only"); + bool printOnly = args.get("perf_cuda_info_only"); if (printOnly) exit(0);