CommandLineParser类(命令行解析类)
该类用于命令行解析。主要是为了方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,不用再在命令行中输入参数或者说可以把一些固定的参数放在这个类里,常变的在命令行中输入。
构造函数
cv::CommandLineParser::CommandLineParser( int argc,
const char *const argv[],
const String & keys )
- argc:命令行参数的数量
- argv:命令行参数的数组
- keys:描述可接受的命令行参数的字符串
keys是一个字符串,包含多个块,每一个都被装在大括号里且描述一个参数。每个参数都被“ | ”符号分隔成三部分。第一部分是参数名称。第二部分是参数的默认值,可以为空。第三部分是描述该参数的帮助信息,可以为空,也可以使用特殊的<none>默认值强制返回的字符串不能为空。如下:
const String keys =
{
"{help h usage ? | | print this message }"
"{@image1 | | image1 for compare }"
"{@image2 |<none>| 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 about(const String &message) //设置相关信息,当调用printMessage函数时,相关信息将在参数列表前被打印出来
bool check() //如果访问参数时发生错误(转换错误、缺少参数等),则返回false。调用printErrors打印错误消息列表。
bool has(const String & name) // 判断参数是否有提供
void printMessage() //打印帮助信息
void printErrors() //打印错误信息
T get<typename T>(const String & name, bool space_delete = true) //通过参数名寻找参数
T get<typename T>(int index, bool space_delete = true) //通过参数索引寻找参数
示例代码
#include <iostream>
#include <opencv2/core/utility.hpp>
using namespace std;
using namespace cv;
int main( int argc, char** argv )
{
//设置参数列表
const String keys =
{
"{help h usage ? | | print this message }"
"{@image1 | | image1 for compare }"
"{@image2 |<none>| 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"); //设置相关信息
parser.printMessage(); //打印帮助信息
//通过参数名和参数索引获取参数的值
int N = parser.get<int>("N");
double fps = parser.get<double>("fps");
String path = parser.get<String>("path");
bool 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;
}
}