CommandLineParser类(命令行解析类)
该类用于命令行解析。主要是为了方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,不用再在命令行中输入参数或者说可以把一些固定的参数放在这个类里,常变的在命令行中输入。
构造
cv::CommandLineParser::CommandLineParser( int argc,
const char *const argv[],
const String & keys )
- argc:命令行参数的数量
- argv:命令行参数的数组
- keys:描述可接受的命令行参数的字符串
keys是一个字符串,包含多个块,每一个都被装在大括号里且描述一个参数。每个参数都被“ | ”符号分隔成三部分。
第一部分是参数名称。
第二部分是参数的默认值,可以为空。
第三部分是描述该参数的帮助信息,可以为空。
如下:
const String keys =
"{help h usage ? | | print this message }"
"{@image1 | | image1 for compare }"
"{@image2 | | image2 for compare }"
"{@repeat |1 | number }"
"{path |. | path to file }"
"{fps | -1.0 | fps for output video }"
"{N count |100 | count of objects }"
"{ts timestamp | | use time stamp }";
}
设置相关信息
void cv::CommandLineParser::about(const String & message)
设置相关信息。相关信息会在 printMessage 被调用时显示。
查错
bool cv::CommandLineParser::check()const
检查解析错误。
当错误发生时返回true。错误可能是转换错误、丢失参数等。
获得keys中的参数信息
通过名称得到参数
template<typename T >
T cv::CommandLineParser::get( const String &name,
bool space_delete=true ) const
- name:参数的名称
- space_delete:从字符串左边和右边删去空格
返回已被转换成指定类型的参数。
如果参数未知或不能转换,则错误标志建立,可被check()检查到。
举例如下:
String keys = "{N count||}";
int N = parser.get<int>("N");
通过位置索引得到参数
template<typename T >
T cv::CommandLineParser::get( int index,
bool space_delete = true)
- index:参数的索引
- space_delete:从字符串左边和右边删去空格
返回已被转换成指定类型的参数。位置索引从0开始编号。
举例如下:
String keys = "{@arg1||}{@arg2||}"
String val_1 = parser.get<String>(0); // returns "abc", arg1
String val_2 = parser.get<String>(1); // returns "qwe", arg2
打印帮助信息
void cv::CommandLineParser::printMessage()const
打印包括相关信息在内的帮助信息。
检查是否有某字段
bool cv::CommandLineParser::has(const String &name)const
检查name是否在参数中被提供。
示例:
const String keys =
"{help h usage ? | | print this message }"
"{@image1 | | image1 for compare }"
"{@image2 | | image2 for compare }"
"{@repeat |1 | number }"
"{path |. | path to file }"
"{fps | -1.0 | fps for output video }"
"{N count |100 | count of objects }"
"{ts timestamp | | use time stamp }";
}
CommandLineParser parser(argc, argv, keys);
parser.about("Application name v1.0.0");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
int N = parser.get<int>("N");
double fps = parser.get<double>("fps");
String path = parser.get<String>("path");
use_time_stamp = parser.has("timestamp");
String img1 = parser.get<String>(0);
String img2 = parser.get<String>(1);
int repeat = parser.get<int>(2);
if (!parser.check())
{
parser.printErrors();
return 0;
}