OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

Table of Contents

简介

如何使用&调试方法

实例代码

效果图

补充:VisualStudio控制台程序带有参数的设定方法


 

简介

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

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

3. 如果在Visual Studio里Command Arguments设定了不同于默认值的参数(例如F:\images\logo.jpg),会以设定的参数(F:\images\logo.jpg)为准,就不会使用默认的参数(F:/images/lena.jpg)了。

这是设定需要带参数名称-image

-image F:\images\logo.png

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

 

实例代码

//头文件
#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.csdn.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;
}

效果图

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

 

补充:VisualStudio控制台程序带有参数的设定方法

如果不想使用CommandLineParse类,生成的.exe需要参数,那么在Debug(F5)时,需要提前输入参数,输入方法如下:

OpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法

如果有多个参数,用空格分开,例如 F:/images/lena.jpg F:/images/mac.jpgOpenCV3 CommandLineParser类代码实例 使用说明 播放视频及效果图 VS2013控制台程序带参数的设定方法