初识opencv是今年的3,4月份,缘由是我个人负责小组国创项目的编程工作,国创项目是关于支持向量机处理视频方面的,刚刚接到项目的时候我们一头雾水,什么是svm?什么是机器学习?视频的组成原理(虽然很早就知道是很多图片连在一起,但现在遇到的问题还有视频在计算机中的存储原理)?对于初出茅庐的我们遇到了很多问题,然后开始了算法学习之路,开始是找各种资料学习支持向量机算法,慢慢开始做实验,做实验的过程中需要处理大量视频和图片,所以我come across 了opencv这个计算机视觉库,个人觉得这个视觉库虽然没有matlab处理方便,但是它是基于c/c++的并且是开源的,所以执行效率和可改造性都很好。所以一头扎进了OpenCV学习中。
OpenCV是一个开源的计算机视觉库(Open Source Computer Version Library) 以前的1.x版本是基于C语言接口的,后来面向对象的C++出现后,相应的出现了OpenCV的2.x接口,学过C和C++的同学应该知道区别在哪,对于OpenCV来说影响最大的就是内存的管理,原来的版本需要你手动去管理内存,而C++ API 因为引入了类,使得有些内存管理不需要手动操作,虽然对于代码量很小的应用程序来说没什么区别,但是当代码量相当大且结构复杂的时候编写程序过程中就会因为内存的管理出现问题,这时候不得不去处理这些问题,所以后来的2.x版本以及现在的3.x版本优势还是很大的。尤其是对于OpenCV这种处理图形(需要合理使用内存)的库来说,内存的管理尤为重要。清楚的记得一次做实验用的C接口的函数(当时还没搞清楚原理只是简单的小实验)就出现了运行结束后有异常出现,原因就是调用图片的函数最后没有及时回收导致堆栈溢出。现在的版本几乎很少遇到这种问题了,因为对象内部会自己释放空间。
OpenCV如今已经模块化了,用官方文档的语言就是 OpenCV has a modular structure。它包含了图像处理,视频处理等诸多模块,下面简单介绍一下各个模块。
OpenCV包中的opencv/sources/modules文件夹中可以看到各个模块
core--核心功能 |
imgproc--图像处理 |
highgui--高层GUI和多媒体i/o |
video--视频分析 |
calib.3d--相机标定和3D建模 |
features--2D特征架构 |
object--物体检测 |
ml--机器学习 |
flann--多维空间聚类和搜索 |
gpu--GPU机器加速视觉 |
photo--计算摄影 |
stitching--图像拼接 |
ocl--OpenGL计算机加速视觉 |
viz--3D视觉 |
关于OpenCV的命名空间,这是C++的一个特性,我们C++中经常见到using namespace std这样的命名空间,也就是标准的命名空间。同样OpenCV也有自己的命名空间。想要使用OpenCV函数,必须通过cv命名空间。
例如
#include <opencv2/core/core.hpp>
cv::Mat H = cv::findHomography(p1, p1, CV_RANDSAC,5);
or
#include <opencv2/core/core.hpp>
using namespace cv;
Mat H = findHomography(p1, p2, CV_RANSAC, 5);
上面代码通过cv命名空间创建了一个Mat类型的对象H并且进行了初始化,只是单纯为了说明cv的使用,如果不能理解的可以去学习C++的命名空间那一讲。
后面我会陆续介绍OpenCV各个模块的使用以及结构和函数原理。