mirror of
https://github.com/opencv/opencv.git
synced 2024-11-28 13:10:12 +08:00
Notification messages about bad parameters in command line were added in CommandLineParser. Update sample, using parser
This commit is contained in:
parent
c7a42e9682
commit
aad9b3219c
@ -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 @@
|
|||||||
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[])
|
|||||||
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[])
|
|||||||
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 @@
|
|||||||
* 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 @@
|
|||||||
#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;
|
|||||||
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
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int ac, char ** av)
|
int main(int ac, const char ** av)
|
||||||
{
|
{
|
||||||
if (ac != 3)
|
help();
|
||||||
{
|
|
||||||
help(av);
|
CommandLineParser parser(ac, av);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
string im1_name, im2_name;
|
string im1_name, im2_name;
|
||||||
im1_name = av[1];
|
im1_name = parser.get<string>("first_file", "left01.jpg");
|
||||||
im2_name = av[2];
|
im2_name = parser.get<string>("second_file", "left02.jpg");
|
||||||
|
|
||||||
|
if (im1_name.empty() || im2_name.empty())
|
||||||
|
{
|
||||||
|
help();
|
||||||
|
printf("\n You have to indicate two files first_file and second_file \n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user