OpenCV3学习笔记(一)
初识OpenCV
OpenCV是一个开源的,优秀的计算机视觉库,官方网站为OpenCV: http://opencv.org/.
Opencv使用Git作为版本管理工具,使用CMake构建工程。OpenCV的不同版本的源码在Github上:http://github.com/opencv/opencv.
OpenCV主要的构成部分两块,OpenCV x.x.x和opencv_contrib,前者是OpenCV主体库,包含了主要的OpenCV中的函数,功能比较稳定,而contrib里面则是一些比较新的算法实现,由于稳定性没法保证,所以被先放在contrib里面,等成熟后再移到OpenCV主体库中,这也是OpenCV不同版本间的一个重要差别,在使用时需要注意看哪些功能在哪个模块里。
帮助文档
参考
:http://docs.opencv.org/
包含了函数,它们的参数以及使用说明。
教程
:http://docs.opencv.org/trunk/d9/df8/tutorial_root.html
包含了许多教程,这些教程主要是任务驱动型的,即教你如何使用OpenCV完成某一件具体的事,还有一些基础课程的教程。
快速指南
:http://opencv.org/quickstart.html
包含了如何指导你在特定平台上获取和运行OpenCV的相关内容。
速查表
:http://docs.opencv.org/3.0-last-rst/opencv_cheatsheet.pdf
只有一页的PDF,对OpenCV的一个高度压缩参考。
问答社区
:http://answers.opencv.org/questions/
OpenCV组成
下面是OpenCV的一些主要模块:
OpenCV部分:
Core
:包含OpenCV库的基础结构以及基本操作。
Improc
:图像处理模块,包含基本的图像转换,包括滤波以及类似卷积的卷积操作。
Highgui
(在OpenCV3.0分割为imcodecs,videoio,highgui三部分):包含了用来显示图像或者简单的输入的用户交互函数,类似于一个轻量级的Window UI工具包。
Video
:包含读取和写视频流的函数。
Calib3d
:包括校准单个,双目以及多个相机的算法实现。
Feature2d
:包含用于检测,描述以及匹配特征点的算法。
Objdectect
:包含检测特定目标,比如人脸或者行人的算法,也可以训练检测器并用来检测其他物体。
Ml
:机器学习模块,包含大量机器学习算法实现并且这些算法能够和OpenCV数据类型很好的兼任。
Flann
:快速最临近库,包含了一些实现最邻近搜索算法的函数,在其他模块中会经常调用。
GPU
:主要是函数在CUDA GPU上的优化实现。
Photo
:包含计算摄影学的一些函数工具。
Stitching
:是一个包含了精巧的图像拼接流程实现算法的模块。
Contrib
:包含一些新的,还没有被集成进OpenCV库的东西。
下面是opencv_contrib里面的一些模块:
Dnn
:深度神经网络
Face
:人脸识别
Text
:文本检测以及识别,基于许多开源的OCR算法
Rbgd
:处理由Kinect或者其他深度传感器获取的RGB深度图像
Bioinspired
:一些基于生物学启发的视觉算法
Tracking
:现代目标追踪算法
OpenCV是一个高度模块化的视觉库,每次在使用这个库里面的相关算法时,都需要在头文件导入相关的模块,导入时就是按照上面列举的一些模块分类来进行分类导入的,知道了这些,在看一些使用OPenCV的程序时对其中的一些头文件就不会感到困惑了,从它们的头文件就能大致知道这个程序在干嘛。
入门的几个例子
加载并显示图片
#include <opencv2/opencv.hpp> // inlucde file for every supported OpenCV function,this file include everything of OpenCV,so it very big and its compile will cost long time
#include "opencv2/highgui/highgui.hpp" //here we only include the file that we need so that we can save some time
#include <string>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv){
Mat img = cv::imread("/home/zhangjc/Programs/learning_opencv3/BlueCup.jpg");
if(img.empty())
return -1;
namedWindow("Example1", WINDOW_AUTOSIZE);
imshow("Example1", img);
waitKey(0);
destroyWindow("Example1");
return 0;
}
加载并播放视频+滚动条控制
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
using namespace std;
int g_slider_position = 0;
int g_run = 1, g_dontset = 0;
cv::VideoCapture g_cap;
// 滑动条的回调函数
void onTrackbarSlide(int pos, void *){
// 点击滑动条到某位置后将视频也滑动到相应的位置
g_cap.set(cv::CAP_PROP_POS_FRAMES,pos);
if(!g_dontset)
g_run = 1;
g_dontset = 0;
}
int main(int argc, char ** argv){
cv::namedWindow("Example2_4", cv::WINDOW_AUTOSIZE);
// 打开视频
g_cap.open("/home/zhangjc/Programs/learning_opencv3/test.avi");
// 获得视频的相关信息
int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);
int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
cout << "Video has" << frames << " frames of dimensions(" << tmpw << "," << tmph << ")" << endl;
// 创建滑动条
cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames, onTrackbarSlide);
cv::Mat frame;
// 读取视频
for (;;){
if(g_run !=0){
g_cap >> frame;
if(frame.empty())
break;
// 获得当前视频帧的位置
int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
g_dontset = 1;
cv::setTrackbarPos("Position", "Example2_4", current_pos);
cv::imshow("Example2_4", frame);
g_run -= 1;
}
char c = (char)cv::waitKey(10);
if(c=='s'){
g_run = 1;
cout << "Single step, run = " << g_run << endl;
}
if(c =='r'){
g_run = -1;
cout << "Run mode,run = " << g_run << endl;
}
if(c ==27)
break;
}
return 0;
}
视频写入
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc,char ** argv){
// 创建两个窗口,分别用来显示原视频和转换后的视频
cv::namedWindow("Example2_11", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Log_Polar", cv::WINDOW_AUTOSIZE);
// 初始化视频对象
cv::VideoCapture capture("/home/zhangjc/Programs/learning_opencv3/test.avi");
double fps = capture.get(cv::CAP_PROP_FPS);
// 定义size对象
cv::Size size(
(int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
(int)capture.get(cv::CAP_PROP_FRAME_HEIGHT)
);
// 定义新创建的视频对象(编码方式,帧率,大小)
cv::VideoWriter writer;
writer.open("/home/zhangjc/Programs/learning_opencv3/createdVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
cv::Mat logpolar_frame, bgr_frame;
for (;;){
capture >> bgr_frame;
if(bgr_frame.empty())
break;
cv::imshow("Example2_11", bgr_frame);
// 极坐标转换
cv::logPolar(
bgr_frame, // 输入帧
logpolar_frame, // 输出帧
cv::Point2f( //中心点
bgr_frame.cols / 2, // x
bgr_frame.rows / 2 ), // y
40,
cv::WARP_FILL_OUTLIERS);
// 展示转换后的视频
cv::imshow("Log_Polar", logpolar_frame);
writer << logpolar_frame;
char c = cv::waitKey(10);
if( c==27 )
break;
}
capture.release();
writer.release();
}