Commit aad9b321 authored by Kirill Kornyakov's avatar Kirill Kornyakov

Notification messages about bad parameters in command line were added in…

Notification messages about bad parameters in command line were added in CommandLineParser. Update sample, using parser
parent c7a42e96
...@@ -4233,7 +4233,6 @@ class CV_EXPORTS CommandLineParser ...@@ -4233,7 +4233,6 @@ class CV_EXPORTS CommandLineParser
template<typename _Tp> template<typename _Tp>
_Tp analyzeValue(const std::string& str); _Tp analyzeValue(const std::string& str);
}; };
template<> CV_EXPORTS template<> CV_EXPORTS
std::string CommandLineParser::analyzeValue<std::string>(const std::string& str); std::string CommandLineParser::analyzeValue<std::string>(const std::string& str);
......
...@@ -3,6 +3,31 @@ ...@@ -3,6 +3,31 @@
using namespace std; using namespace std;
using namespace cv; using namespace cv;
void helpParser()
{
printf("\nThe CommandLineParser class is designed for command line arguments parsing\n"
"Supported syntax: \n"
" --key1=arg1 or --key3 <The keys with '--' can have argument.\n"
"If it has argument, you should assign it through '=' sign> \n"
" -key2=arg2 or -key2 <The keys witn '-' can have argument \n"
"If it has argument, you should assign it through '=' sign> \n"
" key3 <This key can't has any parameter> \n"
"Usage: \n"
" Imagine that the input parameters are next:\n"
" -k=10 --key --db=-10.11 -key1 argument --inputFile=lena.jpg\n"
"parser.get<int>(\"k\")<If you need to take 'k' value.\n"
" It also works with 'unsigned int', 'double', 'float' and 'string' types>\n"
"parser.get<double>(\"db\", 99.99)<If you need to take 'db' value.\n"
" If its value is empty, you will get default value 99.99>\n"
" It also works with 'int', 'unsigned int', 'float' and 'string' types\n"
"parser.get<string>(\"0\")<If you need to take 'key'. It's the first parameter without value\n"
" and it has index 0>\n"
"parser.get<stirng>(\"1\")<If you need to take 'key1'. It's the second parameter without value\n"
" and it has index 1>\n"
"parser.get<stirng>(\"2\")<If you need to take 'argument'. It's the third parameter without value\n"
" and it has index 2>\n\n"
);
}
vector<string> split_string(const string& str, const string& delimiters) vector<string> split_string(const string& str, const string& delimiters)
{ {
...@@ -24,7 +49,6 @@ CommandLineParser::CommandLineParser(int argc, const char* argv[]) ...@@ -24,7 +49,6 @@ CommandLineParser::CommandLineParser(int argc, const char* argv[])
std::string cur_name; std::string cur_name;
std::string buffer; std::string buffer;
std::stringstream str_buff(std::stringstream::in | std::stringstream::out); std::stringstream str_buff(std::stringstream::in | std::stringstream::out);
std::string str_index;
std::map<std::string, std::string >::iterator it; std::map<std::string, std::string >::iterator it;
int find_symbol; int find_symbol;
int index = 0; int index = 0;
...@@ -48,41 +72,65 @@ CommandLineParser::CommandLineParser(int argc, const char* argv[]) ...@@ -48,41 +72,65 @@ CommandLineParser::CommandLineParser(int argc, const char* argv[])
buffer.erase(0, find_symbol + 1); buffer.erase(0, find_symbol + 1);
if (data.find(cur_name) != data.end()) if (data.find(cur_name) != data.end())
{ {
string str_exception="dublicating parameters for name='" + cur_name + "'"; printf("CommandLineParser constructor found dublicating parameters for name=%s\n"
CV_Error(CV_StsParseError, str_exception); , cur_name.c_str());
printf("Constructor will not continue its work since this moment.\n"
"Please enter parameters without dublicates\n");
helpParser();
data.clear();
break;
} }
else else
data[cur_name] = buffer; data[cur_name] = buffer;
} }
else if (cur_name.find('=') == 0) else if (cur_name.find('=') == 0)
{ {
string str_exception="This key is wrong. The key mustn't have '=' like increment' '" + cur_name + "'"; printf("The next key is wrong: key= %s\n", cur_name.c_str());
CV_Error(CV_StsParseError, str_exception); printf("Constructor will not continue its work since this moment.\n"
"Please enter parameters without any mistakes\n");
helpParser();
data.clear();
break;
} }
else if(((int)cur_name.find('-') == -1) && ((int)cur_name.find('=') != -1)) else if(((int)cur_name.find('-') == -1) && ((int)cur_name.find('=') != -1))
{ {
string str_exception="This key must be defined with '--' or '-' increment'" + cur_name + "'"; printf("The next key must be defined with '--' or '-' increment: key= %s\n", cur_name.c_str());
CV_Error(CV_StsParseError, str_exception); printf("Constructor will not continue its work since this moment.\n"
"Please enter parameters without any mistakes\n");
helpParser();
data.clear();
break;
} }
else if (cur_name.find('=') == (cur_name.length() - 1)) else if (cur_name.find('=') == (cur_name.length() - 1))
{ {
string str_exception="This key must have argument after '=''" + cur_name + "'"; printf("The next key must have argument after '=': key= %s\n", cur_name.c_str());
CV_Error(CV_StsParseError, str_exception); printf("Constructor will not continue its work since this moment.\n"
"Please enter parameters without any mistakes\n");
helpParser();
data.clear();
break;
} }
else else
{ {
str_buff<< index; str_buff << index;
str_index = str_buff.str(); while (cur_name.find('-') == 0)
str_buff.seekp(0); cur_name.erase(0,1);
for(it = data.begin(); it != data.end(); it++)
for(it = data.begin(); it != data.end(); it++)
{
if (it->second == cur_name)
{ {
if (it->second == cur_name) printf("CommandLineParser constructor found dublicating parameters for name=%s\n"
{ , cur_name.c_str());
string str_exception="dublicating parameters for name='" + cur_name + "'"; printf("Constructor will not continue its work since this moment.\n"
CV_Error(CV_StsParseError, str_exception); "Please enter parameters without dublicates\n");
} helpParser();
data.clear();
break;
} }
data[str_index.c_str()] = cur_name; }
data[str_buff.str()] = cur_name;
str_buff.seekp(0);
index++; index++;
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* Created on: Oct 17, 2010 * Created on: Oct 17, 2010
* Author: ethan * Author: ethan
*/ */
#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp" #include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/features2d/features2d.hpp" #include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgproc/imgproc.hpp"
...@@ -11,6 +12,7 @@ ...@@ -11,6 +12,7 @@
#include <vector> #include <vector>
#include <iostream> #include <iostream>
using namespace std;
using namespace cv; using namespace cv;
using std::cout; using std::cout;
...@@ -18,13 +20,15 @@ using std::cerr; ...@@ -18,13 +20,15 @@ using std::cerr;
using std::endl; using std::endl;
using std::vector; using std::vector;
void help(char **av) void help()
{ {
cerr << "usage: " << av[0] << " im1.jpg im2.jpg" printf("\nThis program shows how to use BRIEF descriptor to match points in features2d\n"
<< "\n" "It takes in two images, finds keypoints and matches them displaying matches and final homography warped results\n"
<< "This program shows how to use BRIEF descriptor to match points in features2d\n" "Usage: \n"
<< "It takes in two images, finds keypoints and matches them displaying matches and final homography warped results\n" " ./brief_match_test [--first_file]=<first file name, left01.jpg as default> \n"
<< endl; " [--second_file]=<second file name, left02.jpg as default> \n"
"Example: \n"
"./brief_match_test --first_file=left01.jpg --second_file=left02.jpg \n");
} }
//Copy (x,y) location of descriptor matches found from KeyPoint data structures into Point2f vectors //Copy (x,y) location of descriptor matches found from KeyPoint data structures into Point2f vectors
...@@ -55,16 +59,22 @@ double match(const vector<KeyPoint>& /*kpts_train*/, const vector<KeyPoint>& /*k ...@@ -55,16 +59,22 @@ double match(const vector<KeyPoint>& /*kpts_train*/, const vector<KeyPoint>& /*k
int main(int ac, char ** av) int main(int ac, const char ** av)
{ {
if (ac != 3) help();
CommandLineParser parser(ac, av);
string im1_name, im2_name;
im1_name = parser.get<string>("first_file", "left01.jpg");
im2_name = parser.get<string>("second_file", "left02.jpg");
if (im1_name.empty() || im2_name.empty())
{ {
help(av); help();
return 1; printf("\n You have to indicate two files first_file and second_file \n");
return -1;
} }
string im1_name, im2_name;
im1_name = av[1];
im2_name = av[2];
Mat im1 = imread(im1_name, CV_LOAD_IMAGE_GRAYSCALE); Mat im1 = imread(im1_name, CV_LOAD_IMAGE_GRAYSCALE);
Mat im2 = imread(im2_name, CV_LOAD_IMAGE_GRAYSCALE); Mat im2 = imread(im2_name, CV_LOAD_IMAGE_GRAYSCALE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment