Opencv 命令行解析器
class CV_EXPORTS CommandLineParser
{
public:
CommandLineParser(int argc, const char* const argv[], const String& keys);//构造函数
CommandLineParser(const CommandLineParser& parser); //复制构造函数
CommandLineParser& operator = (const CommandLineParser& parser); //重载符号=
~CommandLineParser();//析构函数
String getPathToApplication() const;//返回应用的地址 argv[0]内容
//返回转换为选定类型的参数。 如果参数未知或者无法转换为指定的类型,设置错误标志
template <typename T>
T get(const String& name, bool space_delete = true) const
{
T val = T();
getByName(name, space_delete, ParamType<T>::type, (void*)&val);
return val;
}
//brief Access positional arguments by index 通过索引访问参数
template <typename T>
T get(int index, bool space_delete = true) const
{
T val = T();
getByIndex(index, space_delete, ParamType<T>::type, (void*)&val);
return val;
}
bool has(const String& name) const;//是否含有指定string name的对象
bool check() const;//检查解析错误
void about(const String& message);//设置about信息
void printMessage() const;//显示帮助信息
void printErrors() const;//显示错误信息
protected:
void getByName(const String& name, bool space_delete, int type, void* dst) const;
void getByIndex(int index, bool space_delete, int type, void* dst) const;
struct Impl;
Impl* impl;
};
使用:
const char *keys =
{
"{help h usage ?||print this message}"
"{@video||Video file,if not defined try to use webcamera}"
};
为一个命令行解析器做的第一件事是需要定义需要或者允许一个再常字符向量中的参数,每一行的模式为
{name_param|default|value|description}
name_param前可以带有@,定义了这个参数为默认值输入
int main(int argc, const char ** argv)
{
CommandLineParser parser(argc, argv, keys); //构造函数获得主函数的输入和之前定义的关键常量
parser.about("Chapter 2. v1.0.0");
//如果需要,显示帮助文档
if (parser.has("help")) //检查参数是否存在
{
parser.printMessage();
return 0;
}
String videoFile = parser.get<String>(0); //.get<typename>(parameterName),可以访问和读取任何的输入参数
//分析params的变量,检查params是否正确
if (!parser.check()) //变量是否正确解析
{
parser.printErrors();
return 0;
}
...
...
return 0;
}