opencv CommandLineParser类功能解释


class CV_EXPORTS CommandLineParser
{
public:

	/*
	* 函数功能:构造函数
	* 参数:
	*   [in]     argc        main函数中的第一参数,即运行程序中获得指令的个数
	*   [in]     argv        main函数中的第二个参数,即运行程序中指令的内容
	*   [in]     key_map     当启动程序是没有输入任何指令,则使用key_map中默认的指指令。
	* 备注:
	*   key_map中的格式:
	*       "{    s|  123asd       |string parameter}
	*        {    d|  100          |digit parameter }
	*        {   @c|  false        |without camera  }
	*        {    1|  some text    |help            }
	*        {    2|  333          |another help    }"
	*参数or指令名称|指令or参数内容 |指令说明
	*
	*
	*  运行程序输入指令的方式如下:(例如程序名称为extest.exe)
	*  extest.exe -s=123asdd -d=1000 -@c=10
	*  注意:指令名称前面需要加一个“-”,或“--”。当输入指令后面没有参数,默认为true
	*       另外,前面加@的指令可以不输入指令名称,直接设置指令内容即可。
	*       没有输入的指令,则使用key_map中的默认值
	*/
	CommandLineParser(int argc, const char* const argv[], const String& keys);


	CommandLineParser(const CommandLineParser& parser);


	CommandLineParser& operator = (const CommandLineParser& parser);


	~CommandLineParser();


	String getPathToApplication() const;

	/*
	* 函数功能:获得指令名称的参数值
	* 参数:
	*   [in]     name            指令名称,注意此处不要加"-"
	*   [in]     space_delete    此参数默认为true,把参数内容中的头尾的空格去掉。
	*/
	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;
	}


	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;
	}


	/*
	* 函数功能:查看是否有此指令名称,如果没有此指令名称报错;若果有此指令,并且此指令有值,则返回true
	* 参数:
	*   [in]     keys            指令名称
	* 返回值
	*   含有返回true
	* 备注:
	*     此函数本质上是检查两个东西:
	*     1、此指令是否存在
	*     2、此指令对应的指令内容存在;
	*     以上二者都存在,返回true;
	*     所以,只要在命令行输入此值令,并且指令存在,一定返回ture.(因为如果不指定参数内容,系统会默认true)
	*     但是,在构造函数key_map中,如果指令参数没有填写。即使key_map中存在此指令,也会返回false。(因为没有参数内容)(另外;前提是命令行没有输入此指令)
	*/
	bool has(const String& name) const;

	/*
	* 函数功能:检查输入的指令是否有有错误,即无法解析
	* 参数:
	*   [in]
	* 返回值:
	*    没有错误返回true,有错误返回false
	*/
	bool check() const;


	void about(const String& message);


	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;
};

注释的几条函数为常用函数:

1、构造函数------接收命令行输入的指令

2、get-----获得指定的参数的内容

3、has----在get之前可以先检查是否含有此指令

4、check---在使用这些参数之前,检查是否有解析错误的现象;



例程:采用的opencv中 calibration的例程

int main( int argc, char** argv )
{
    cv::CommandLineParser parser(argc, argv,
        "{help||}{w|8|}{h|11|}{pt|chessboard|}{n|10|}{d|1000|}{s|20|}{o|out_camera_data.yml|}"
        "{op||}{oe||}{zt||}{a|1|}{p||}{v||}{V|0|}{su|1|}"
        "{@input_data|0|}");   // 




    if (parser.has("help"))
    {
        help();
        return 0;
    }
    boardSize.width = parser.get<int>( "w" );
    boardSize.height = parser.get<int>( "h" );
    if ( parser.has("pt") )
    {
        string val = parser.get<string>("pt");
        if( val == "circles" )
            pattern = CIRCLES_GRID;
        else if( val == "acircles" )
            pattern = ASYMMETRIC_CIRCLES_GRID;
        else if( val == "chessboard" )
            pattern = CHESSBOARD;
        else
            return fprintf( stderr, "Invalid pattern type: must be chessboard or circles\n" ), -1;
    }
    squareSize = parser.get<float>("s");
    nframes = parser.get<int>("n");
    aspectRatio = parser.get<float>("a");
    delay = parser.get<int>("d");
    writePoints = parser.has("op");
    writeExtrinsics = parser.has("oe");
    if (parser.has("a"))
        flags |= CALIB_FIX_ASPECT_RATIO;
    if ( parser.has("zt") )
        flags |= CALIB_ZERO_TANGENT_DIST;
    if ( parser.has("p") )
        flags |= CALIB_FIX_PRINCIPAL_POINT;
    flipVertical = parser.has("v");
    videofile = parser.has("V");
    if ( parser.has("o") )
        outputFilename = parser.get<string>("o");
    showUndistorted = parser.has("su");
    if ( isdigit(parser.get<string>("@input_data")[0]) )
        cameraId = parser.get<int>("@input_data");
    else
        inputFilename = parser.get<string>("@input_data");
    if (!parser.check())
    {
        help();
        parser.printErrors();
        return -1;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值