首页 > 其他分享 >OpenCV的CommandLineParser类

OpenCV的CommandLineParser类

时间:2023-07-08 22:56:28浏览次数:43  
标签:exe keys argv OpenCV int 参数 CommandLineParser 命令行

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

相关文章

  • OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割m
    如果需要处理的原图及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来不想碎碎念,但是我已经在图像后缀上栽倒两次了。而且因为无意犯错,根本找不到问题。不论是在深度学习的语义分割中,还是在图......
  • opencv
    /*intmain(){cv::VideoCapturecap(0);if(!cap.isOpened()){cout<<"videonotexist!"<<endl;return-1;}cv::Matframe,mask,maskCp;cv::Matcnimg;std::vector<std::vector<cv::P......
  • opencv dnn学习
     (1条消息)OpenCV中blobFromImage函数详细解释_cv::dnn::blobfromimage_阿卡基YUAN的博客-CSDN博客 ......
  • Qt+opencv dnn模块调用tensorflow模型
    参考网址(1条消息)Qt+opencvdnn模块调用tensorflow模型_vsqt调用tensorflow_街道口扛把子的博客-CSDN博客代码地址:GitHub-Whu-wxy/Simple_Qt_opencv_dnn:UsingdeeplearningmodelwithopencvinQt修改运行后的代码如下:#include<QCoreApplication>#include<opencv2\o......
  • 在全志V853上进行Opencv库的编译步骤
    OpenCV(OpenSourceComputerVision)是一个开放源代码的计算机视觉库,它提供了一系列函数和算法,用于处理图像和视频。通过使用OpenCV,您可以进行各种计算机视觉任务,例如图像处理、对象识别、目标追踪、人脸检测和机器学习等。它提供了底层图像处理功能,以及高级功能和模块,如特征提取、......
  • python opencv无法编码h264、opencv编码的mp4视频无法在网页中播放
    pythonopencv无法编码h264、opencv编码的mp4视频无法在网页中播放,这好像是因为开源许可的协议不同,导致pythonopencv中没有内置h264的编码,无法以h264的格式保存视频。所以我就直接使用webm格式的视频:output_path='output_video.webm'output_codec=cv2.VideoWriter_fourcc......
  • 1 opencv-python图像读写模块
    这个分类记录自己学习opencv的随笔文档,方便以后查询和复习。python-opencv环境配置网上教程很多,此处就不做赘述了,该文档记录opencv最基础的图像读写和显示,工具是jupyternotebook。1opencv中,图像读取函数是imread(filename,flags=None)参数说明:filename:读取图像的路径,通常支......
  • OpenCV4环境配置详细指南(C++)
      OpenCV编程学习今天正式开始,简要的记录一下,希望对大家有用。1:所需文件   开发工具:VisualStudio   下载地址   视觉库:OpenCV  下载地址2:安装  VisualStudio下载好后直接安装,一定要选择C++模块  OpenCV下载好后,双击解压到合适的位置,......
  • 用OpenCV进行传统图像分割
    1.引言欢迎回来,我的图像处理爱好者们!本文我们将直接进入传统图像分析的新领域——图像分割,这是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像划分成互不相交的区域的过程。闲话少说,我们直接开始吧!2.基于阈值的分割首先介绍的是基于阈值和基于Otsu的......
  • OpenCV:最流行的图像处理库
    https://www.cnblogs.com/traditional/p/11193524.html楔子关于Python的图像处理,我们之前介绍一个第三方库叫PIL,现在我们来介绍另一个库OpenCV。从功能和性能上来讲,OpenCV要比PIL强大很多,而且OpenCV还可以处理视频。那么下面我们就来介绍一下OpenCV的用法,首先是安......