看到有几本新的opencv书出来,梳理一下之前没看到过的知识:
CommandLineParser类:可以帮助管理需要输入的命令行参数
CommandLineParser的构造函数为:
CommandLineParser parser(argc,argv,keys):其中前2个参数是命令行传过来的,第3个就是刚刚定义的keys了;
第三个参数keys可以定义为如下:
const char* keys =
{
“{help h usage ? | | print this message}”
“{@video | | Video file ,if not defined try tp use webcamera }”
};
每一行都有这种模式:
{ name_param | default_value | description}
name_param 前面可以带有@,这样定义了这个参数的默认输入值,可以使用多个name_param
CommandLineParser类包含一些方法:
.has方法检查参数是否存在,这在这个定义的keys中检查用户是否添加——usage或者?参数
.printMessage可以显示所有描述参数
.get<typename>(parameterName)
可以访问和读取任意输入的参数
.printErrors() 用来打印错误
关于CommandLineParser类还可以看下面几篇博客:
http://blog.csdn.net/yzhang6_10/article/details/51074305
http://www.cnblogs.com/tornadomeet/archive/2012/04/15/2450505.html
代码:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
#include<opencv2\core.hpp>
#include<opencv2\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
const char* keys =
{
"{help h usage ? | | print this message}"
"{@video | | Video file ,if not defined try tp use webcamera }"
};
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);
if (!parser.check())
{
parser.printErrors();
return 0;
}
VideoCapture cap;
if (videoFile != "")
{
cap.open(videoFile);
}
else
{
cap.open(0);
}
if (!cap.isOpened())
{
return -1;
}
namedWindow("video", 1);
for (;;)
{
Mat frame;
cap >> frame;
imshow("video", frame);
if (waitKey(30) >= 0)
{
break;
}
}
cap.release();
return 0;
}
这是一个打开摄像头代码,之前用了一下CommandLineParser类
运行结果: