C++带有参数的main函数
我们可以使用命令行的方式给argv赋值:
1 #include <iostream> 2 #include <cstdlib> 3 4 // int main(int argc, char *argv[]) 5 int main(int argc, char **argv) 6 { 7 8 int sum = 0; 9 for (int i = 1; i < argc; ++i) 10 { 11 int num_i = atoi(argv[i]); // 字符串转换成整数,通过命令行传入参数给程序使用 12 sum += num_i; 13 } 14 std::cout << sum; 15 16 return 0; 17 }
编译程序,生成.exe文件,windows环境下,可以进入cmd界面,通过cd
指令进入exe文件的所在目录。
比如我这里所生成的Project.exe文件路径为 E:\C++ Projects\MediaTek\03 数列求和\Project1\Debug,在cmd界面,输入cd E:\C++ Projects\MediaTek\03 数列求和\Project1\Debug
,回车,从而进入exe文件的所在目录。
接下来输入Project1.exe 11 12 13 14
,回车,结果显示为50。
这里面argv[0]=Project1.exe,argv[1]=11,argv[2]=12,argv[3]=14;
我们可以使用VS中的属性页给argv赋值:
这里面argv[0]=SemiGlobalMatching-v19.exe,argv[1]=..\Data\Teddy\im0.png ..\Data\Teddy\im1.png,argv[2]=0,argv[3]=128;
注意以上两种方法argv各参数要用空格隔开
OpenCV的CommandLineParser类
头文件为:#include <opencv2/core/utility.hpp>
该类用于命令行解析。主要是为了方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,不用再在命令行中输入参数或者说可以把一些固定的参数放在这个类里,常变的在命令行中输入。
构造函数:
1 cv::CommandLineParser::CommandLineParser(int argc, const char *const argv[],const String & keys)
argc:命令行参数的数量(来自main())
argv:命令行参数的数组(来自main())
keys字符串描述可接受的命令行参数
keys语法
keys是一个字符串,包含多个块,每一个都被装在大括号里且描述一个参数。每个参数都被“ | ”符号分隔成三部分。
第一部分是参数名称。
第二部分是参数的默认值,可以为空。
第三部分是描述该参数的帮助信息,可以为空。
1 const String keys = 2 "{help h usage ? | | print this message }" 3 "{@image1 | | image1 for compare }" 4 "{@image2 |acd.jpg| image2 for compare }" 5 "{@repeat |1 | number }" 6 "{path |. | path to file }" 7 "{fps | -1.0 | fps for output video }" 8 "{N count |100 | count of objects }" 9 "{ts timestamp | | use time stamp }" 10 ; 11 }
注意,我们可以使用has()
方法检查它们的默认值是否存在。如果存在默认值,则可以使用get()
方法来检查它们的实际值。
常见的搭配:
1 CommandLineParser parser(argc, argv, keys); 2 if ( parser.has("path") ) 3 outputFilename = parser.get<string>("path");
设置相关信息
我们可以通过相关信息对我们的命令行参数进行说明
1 void cv::CommandLineParser::about(const String & message) 2 // parser.about("\nThis program demonstrates connected components and use of the trackbar\n");
相关信息和keys的内容会在printMessage()
被调用时显示。
使用方式如下:
1 parser.about("This is my first use it"); 2 parser.about("This is my second time use it"); 3 parser.printMessage();
可以看到我们用了两个about函数,可是相关信息取了第二个
注意我们去掉printMessage()语句时命令行中将不会显示相关信息和keys里的内容
keys中命令参数的含义
我们可以
进入cmd界面,通过cd
指令进入exe文件的所在目录。
比如我这里所生成的test.exe文件路径为 C:..\Debug,在cmd界面输入cd C:..\Debug
,回车,从而进入test.exe文件的所在目录。然后输入test.exe,展示的界面如下:
- keys中有@的参数名称将在(1)中按出现的顺序显示
- keys中无@的参数详细信息将在(2)中出现的顺序显示,注意单个字符前面是-,字符串前面是--
- keys中有@的参数详细信息将在(3)按中出现的顺序显示
- 一个参数可以有多个名字例如(2)中第一个参数的名字有?,h,help,usage
当我想在命令行中修改参数时:
修改无@:
有无默认值的修改方式都一样
注意这个地方写-N和--N都行
修改有@:
必须一起修改
从上述可知直接在命令行中修改比较麻烦,我们可以直接在程序中修改默认值
参考文章:
C++中 int main(int argc, char **argv) 命令行传递参数 - 东聃 - 博客园 (cnblogs.com)
(99条消息) OpenCV基础(27)CommandLineParser使用_求则得之,舍则失之的博客-CSDN博客
标签:exe,keys,argv,OpenCV,int,参数,CommandLineParser,命令行 From: https://www.cnblogs.com/Sandals-little/p/17538048.html