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前可以使用@代表这个参数为默认值输入。
它包含了以下几种方法:
- .about("[str1]") 用于设置相关信息,定义如下:
void cv::CommandLineParser::about(const String & message)
- .get(parameterName) 用于访问和读取输入参数,其定义如下:
template<typename T >
T cv::CommandLineParser<T>::get( const String &name,
bool space_delete=true ) const
其中name代表参数名称space_delete的默认值为true,即把参数内容中的头和尾的空格去掉,并且返回的是参数类型。
- .check() 用于分析CommendLineParser的变量是否正确,其定义如下:
bool cv::CommandLineParser::check()const
当出现丢失参数或参数未知的情况下返回false。
- .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
它包含了以下几种方法
- .open() 用于打开一个视频文件或者打开摄像头,其定义如下:
//打开视频文件
bool VideoCapture::open(const string& filename)
//打开视屏捕获设备,即摄像头,如果只有一个摄像头可以填0,表示打开默认的摄像头。
bool VideoCapture::open(int device)
- .isOpened() 用于判断视频读取或是摄像头调用是否成功,其定义如下:
bool VideoCapture::isOpened() //成功即返回true
- .release() 用于关闭视频文件或者是摄像头,其定义如下:
void VideoCapture::release()
在计算机视觉应用中释放所有资源是非常重要的,如果不进行这步操作,那么RAM内存会被全部消耗掉。
- .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;
}
运行结果为打开了自身设备的摄像头,并成功看到了帅气的自己。