开发者社区> wangxiaocvpr> 正文

OpenCV CommandLineParser 的用法

简介: OpenCV CommandLineParser 的用法 去百度了一下,关键字:OpenCV CommandLineParser  发现,最多的讲解是:opencv源码解析之(5):CommandLineParser类的简单理解  链接:http://www.
+关注继续查看

OpenCV CommandLineParser 的用法

去百度了一下,关键字:OpenCV CommandLineParser  发现,最多的讲解是:opencv源码解析之(5):CommandLineParser类的简单理解  链接:http://www.cnblogs.com/tornadomeet/archive/2012/04/15/2450505.html

 

 1 // minimalistic foreground-background segmentation sample, based off OpenCV's bgfg_segm sample
 2 
 3 #include "BackgroundSubtractorSuBSENSE.h"
 4 
 5 #include <opencv2/core/core.hpp>
 6 #include <opencv2/imgproc/imgproc.hpp>
 7 #include <opencv2/video/background_segm.hpp>
 8 #include <opencv2/highgui/highgui.hpp>
 9 #include <stdio.h>
10 
11 static void help() {
12     printf("\nMinimalistic example of foreground-background segmentation in a video sequence using\n"
13             "OpenCV's BackgroundSubtractor interface; will analyze frames from the default camera\n"
14             "or from a specified file.\n\n"
15             "Usage: \n"
16             "  ./bgfg_segm [--camera]=<use camera, true/false>, [--file]=<path to file> \n\n");
17 }
18 
19 const char* keys = {
20     "{c  |camera   |true     | use camera or not}"
21     "{f  |file     |tree.avi | movie file path  }"
22 };
23 
24 int main(int argc, const char** argv) {
25     help();
26     cv::CommandLineParser parser(argc, argv, keys);
27     const bool bUseDefaultCamera = parser.get<bool>("camera");
28     const std::string sVideoFilePath = parser.get<std::string>("file");
29     cv::VideoCapture oVideoInput;
30     cv::Mat oCurrInputFrame, oCurrSegmMask, oCurrReconstrBGImg;
31     if(bUseDefaultCamera) {
32         oVideoInput.open(0);
33         oVideoInput >> oCurrInputFrame;
34     }
35     else {
36         oVideoInput.open(sVideoFilePath);
37         oVideoInput >> oCurrInputFrame;
38         oVideoInput.set(CV_CAP_PROP_POS_FRAMES,0);
39     }
40     parser.printParams();
41     if(!oVideoInput.isOpened() || oCurrInputFrame.empty()) {
42         if(bUseDefaultCamera)
43             printf("Could not open default camera.\n");
44         else
45             printf("Could not open video file at '%s'.\n",sVideoFilePath.c_str());
46         return -1;
47     }
48     oCurrSegmMask.create(oCurrInputFrame.size(),CV_8UC1);
49     oCurrReconstrBGImg.create(oCurrInputFrame.size(),oCurrInputFrame.type());
50     cv::Mat oSequenceROI(oCurrInputFrame.size(),CV_8UC1,cv::Scalar_<uchar>(255)); // for optimal results, pass a constrained ROI to the algorithm (ex: for CDnet, use ROI.bmp)
51     cv::namedWindow("input",cv::WINDOW_NORMAL);
52     cv::namedWindow("segmentation mask",cv::WINDOW_NORMAL);
53     cv::namedWindow("reconstructed background",cv::WINDOW_NORMAL);
54     BackgroundSubtractorSuBSENSE oBGSAlg;
55     oBGSAlg.initialize(oCurrInputFrame,oSequenceROI);
56     for(int k=0;;++k) {
57         oVideoInput >> oCurrInputFrame;
58         if(oCurrInputFrame.empty())
59             break;
60         oBGSAlg(oCurrInputFrame,oCurrSegmMask,double(k<=100)); // lower rate in the early frames helps bootstrap the model when foreground is present
61         oBGSAlg.getBackgroundImage(oCurrReconstrBGImg);
62         imshow("input",oCurrInputFrame);
63         imshow("segmentation mask",oCurrSegmMask);
64         imshow("reconstructed background",oCurrReconstrBGImg);
65         if(cv::waitKey(1)==27)
66             break;
67     }
68     return 0;
69 }

 

以下内容出自:http://www.cnblogs.com/tornadomeet/archive/2012/04/15/2450505.html

 

第一行就是这个类的构造函数,前2个参数是命令行传过来的,第3个就是刚刚定义的keys了,keys的结构有一定规 律,比如说"{c |camera   |false    | use camera or not}" 都是用大括号和双引号引起来,然后中间的内容分成4断,用”|”分隔开,分别表示简称,文件来源,文件值和帮助语句。第二行和第三行表示打开摄像头和打开 文件,文件的文件名等都在keys指针中了。

  最后一行为打印keys中的参数,如下:

  

    大概可以看出来用这个类的好处就是很方便,因为以前版本没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,并且输入的参 数格式要与代码中的if语句判断内容格式一样,一不小心就输错了,很不方便。另外如果想要更改输入格式的话在主函数文件中要相应更改很多地方。现在有了这 个类,只需要改keys里面的内容就可以了,并且运行时可以直接在vs下用F5,不需要cmd命令行带参运行。最后这个类封装了很多函数,可以直接用,只 不过这个本来就是类结构的优点。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19111 0
Qt .pro文件之defineReplace函数的用法,实现lib文件名自动添加后缀“d“
Qt .pro文件之defineReplace函数的用法,实现lib文件名自动添加后缀“d“
91 0
一个内存增长问题的分析和处理(二)——valgrind工具的用法
valgrind是linux下对C++和C程序进行内存泄露检测的工具,除了内存检测,valgrind还提供了很多其他的功能,这里主要介绍下valgrind的内存检测的功能。   首先是文件的下载,valgrind的官方网址是http://valgrind.org/,最新版本的valgrind是3.9,下载地址如下:http://valgrind.org/downloads/。
809 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23940 0
Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)
Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)目录 1 问题说明2 修改max open files3 修改max user processes4 附录: ulimit命令说明1 问题说明Linux 系统默认的max ope...
3561 0
Windows系统命令行net user命令用法
原文:Windows系统命令行net user命令用法 在Windows渗透测试过程中,最常用的要数net user 命令了,但是非常多的时候我们都是对Linux命令非常熟悉,对Windows命令非常熟悉或者了解用法的少只有少,为了以后工作方便,这里记录一下Windows系统中的 net user 命令的用法。
1266 0
DotNetBar.Bar作为容器使用的方法及Text更新原理
DotNetBar.Bar作为容器使用的方法及Text更新原理                         老帅    一、容器使用方法   控件DevComponents.DotNetBar.Bar是可以有多种用途的,其中一种是用作容器,如下图的SQLServer管理器,就是一个容器,容器里面存在两个页面“对象资源管理器详细信息”和“对象资源管理器“,这两个页面上又分别容纳了多种控件。
981 0
+关注
wangxiaocvpr
编程语言,算法相关技术专家
311
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载