OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法
Table of Contents
简介
OpenCV源码中对CommandLineParse的说明如下:
Designed for command line parsing
CommandLineParse类主要用来解析命令行输入参数。
作用:方便用户在命令行使用过程中减少工作量。
不用每次都手动输入参数,非常方便。
具体如何用请看代码,里面有用中文详细注释。
说明:
每个指令用双引号+花括号括起来,
格式为如下,用竖线|来区分
指令全称 指令简称 |指令默认值 |指令的帮助语句
如何使用&调试方法
1. 如果需要更改输入的参数格式与内容,只需要改keys里面的内容
例如:我程序里默认使用“F:/images/lena.jpg”这张图片,但是我想换一张图片,可以在控制台这样输入:
CmdLineParser.exe -image F:\images\logo.jpg
非常方便。
2. 可以直接在Visual Studio下用F5,不需要设定Command Arguments
调试伴侣:Image Watch【目前只支持VS2012/2013/2015】
下载链接:
https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch
3. 如果在Visual Studio里Command Arguments设定了不同于默认值的参数(例如F:\images\logo.jpg),会以设定的参数(F:\images\logo.jpg)为准,就不会使用默认的参数(F:/images/lena.jpg)了。
这是设定需要带参数名称-image
-image F:\images\logo.png
实例代码
//头文件
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv; //包含cv命名空间
using namespace std;
static void help()
{
printf("Current OpenCV version:" CV_VERSION);
std::cout << "\nThis program demonstrates the use of CommandLineParser.\n"
<< "Usage: \n" << "test [image_name -- Defaults to F:/images/lena.jpg]" << std::endl;
}
const char* keys =
{
"{help h||}" //help信息
"{@image|F:/images/lena.jpg|input image file}" //默认读入F:/images/answer_bottom.png
"{camera c |false | use camera or not}" //指令全称 指令简称 |指令默认值 |指令的帮助语句
"{file_name f |F:/images/fun.gif | movie file path }" //指令全称 指令简称 |指令默认值 |指令的帮助语句
};
int main(int argc, char ** argv)
{
//【1】构造一个CommandLineParser实例,并打印帮助信息
CommandLineParser parser(argc, argv, keys);
if (parser.has("help"))
{
help();
return 0;
}
parser.printMessage(); //打印帮助信息
//【2】处理image参数
string inputImage = parser.get<string>(0); //image参数为字符串
cout << "inputImage:" << inputImage << endl;
// Load the source image. HighGUI use.
Mat srcImage = imread(inputImage, CV_LOAD_IMAGE_COLOR); //读入图片
if (srcImage.empty())
{
std::cerr << "Cannot read image file: " << inputImage << std::endl;
return -1;
}
char input_title[] = "input image"; //输入窗口的标题
char output_title[] = "output image"; //输出窗口的标题
//CV_WINDOW_NORMAL - 用户可以调整窗口大小
//CV_WINDOW_AUTOSIZE - 用户不可以调整窗口大小,由展示的图片决定
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, srcImage); //显示输入图片
//【3】对输入图片进行处理
Mat dstImage;
cvtColor(srcImage, dstImage, COLOR_BGR2GRAY); //转为灰度图
imshow(output_title, dstImage); //显示输入图片
//【4】处理camera与 file_name参数
bool useCamera = parser.get<bool>("camera"); //camera为bool值
string file = parser.get<string>("file_name"); //file_name为字符串
cout << "useCamera:" << useCamera << endl;
cout << "file:" << file << endl;
VideoCapture cap;
if (useCamera)
cap.open(0);
else
cap.open(file.c_str());
//【5】读取视频并对视频中的每一帧进行提取边缘
//参考网址 https ://blog.****.net/qq_32925781/article/details/53709271
while (true) {
Mat frame;
Mat edge;
cap >> frame;
if (frame.empty())
break;
cvtColor(frame, edge, COLOR_BGR2GRAY); //转为灰度图
blur(edge, edge, Size(7, 7)); //进行blur处理
Canny(edge, edge, 10, 30); //提取边缘
imshow("Video", frame); //显示原始视频中的一帧图片
imshow("After canny", edge); //显示经过处理的图像 - 边缘图
//等待50ms,如果从键盘输入的是q、Q、或者是Esc键,则退出
int key = waitKey(50);
if (key == 'q' || key == 'Q' || key == 27)
break;
}
waitKey(0); // 【6】等待任意按键按下
return 0;
}
效果图
补充:VisualStudio控制台程序带有参数的设定方法
如果不想使用CommandLineParse类,生成的.exe需要参数,那么在Debug(F5)时,需要提前输入参数,输入方法如下:
如果有多个参数,用空格分开,例如 F:/images/lena.jpg F:/images/mac.jpg