OpenCV学习笔记



CommandLineParser类

它是一个命令行解析类,用于帮助我们管理输入的命令行参数,首先了解其定义:

cv::CommandLineParser::CommandLineParser( int argc, 
                                          const char **argv, 
                                          const String & keys )
  • argc 为命令行参数的个数(一般对应于main函数的argc)
  • argv 为命令行参数的指针,用于调用参数(一般对应于main函数的argv)
  • keys 为命令行解析器接受的指令,其中得先定义一个在常字符向量中的参数,每一行都具有该模式:{ name_param(参数名称) , default_value(参数默认值,可以为空) , description(帮组信息) } ,name_param前可以使用@代表这个参数为默认值输入。


它包含了以下几种方法:
  1. .about("[str1]") 用于设置相关信息,定义如下:
void cv::CommandLineParser::about(const String & message)



  1. .get(parameterName) 用于访问和读取输入参数,其定义如下:
template<typename T >
T cv::CommandLineParser<T>::get( const String &name, 
                              bool space_delete=true ) const

其中name代表参数名称space_delete的默认值为true,即把参数内容中的头和尾的空格去掉,并且返回的是参数类型。

  1. .check() 用于分析CommendLineParser的变量是否正确,其定义如下:
bool cv::CommandLineParser::check()const

当出现丢失参数或参数未知的情况下返回false。



  1. .has() 用于检查参数是否存在,其定义如下:
bool cv::CommandLineParser::has(const String &name)const


VideoCapture类

在OpenCV的新版本中,VideoCapture类属于videoio的子模块,用于对视频进行读取和调用摄像头等的操作。首先了解其定义:

//以下是VideoCapture类的构造函数
cv::VideoCapture::VideoCapture();    
cv::VideoCapture::VideoCapture(const string & filename);   //dilename对应打开的视频文件名
cv::VideoCapture::VideoCapture(int device);   //对应为打开的视频捕获设备id



它包含了以下几种方法
  1. .open() 用于打开一个视频文件或者打开摄像头,其定义如下:
//打开视频文件
bool VideoCapture::open(const string& filename) 

//打开视屏捕获设备,即摄像头,如果只有一个摄像头可以填0,表示打开默认的摄像头。
bool VideoCapture::open(int device)



  1. .isOpened() 用于判断视频读取或是摄像头调用是否成功,其定义如下:
bool VideoCapture::isOpened()  //成功即返回true



  1. .release() 用于关闭视频文件或者是摄像头,其定义如下:
void VideoCapture::release()

在计算机视觉应用中释放所有资源是非常重要的,如果不进行这步操作,那么RAM内存会被全部消耗掉。

  1. .grab() 用于从视频文件或捕获设备中获取帧,其定义如下:
bool VideoCapture::grab()   //调用成功即返回true

获取视频帧以及摄像头的帧图像还有其他方法,如直接使用重载过的输入运算符 **>>**即可。

VideoCapture类内容的参考链接http://blog.sina.com.cn/s/blog_a231c5270102x2qg.html


具体代码如下:
# CMakeLists.txt文件
cmake_minimum_required( VERSION 2.8 )
project( test4 )

set(CMKAE_CXX_FLAGS "-std=c++11")

find_package( OpenCV 3 REQUIRED )

include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(test4 test4.cpp)

target_link_libraries(test4 ${OpenCV_LIBS})
// test4.cpp文件
#include<iostream>
#include<vector>
#include<string>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

//命令行解析器接受的指令
const string keys=
	"{help husage ? | | print this message}"
	"{@video | | video file, if not defined try to use webcamera}";

int main(int argc,char** argv)
{
	CommandLineParser parser(argc,argv,keys);
	parser.about("test4");
	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;
}

运行结果为打开了自身设备的摄像头,并成功看到了帅气的自己。