从第一次接触Opencv也过去有大半年了,不过以前用的都很少,多半是上课作业或者自己随意玩玩。近期实现一篇论文有要用到Opencv,虽然论文比较简单,但是在实现过程中发现,自己那些零零碎碎的Opencv知识影响到了代码质量以及程序效率。所以想重新把Opencv学习一下,在这里,我把自己在学习过程中的一些重点以及自己的一些想法跟大家以笔记的形式分享一下。由于本人在计算机领域都是个新手,所以容易犯一些低级错误,还请大家不吝指正,如果能哪怕有一点帮到一些人,我都深感欣慰了!
好了,这一节先对Opencv做个简单介绍。接下来分为四部分介绍:Opencv是什么、Opencv的主要模块简介、在实践中对Opencv的使用、Opencv的学习及学习资料。
一、 Opencv是什么
Opencv的全称是Open Source Computer Vision Library,也就是计算机视觉开源库。这里说到,Opencv就是一个库(它是基于C++语言的,当然也可在其他平台使用,如Java,Python),这个库是用在计算机视觉领域的,同时是开源的,也就是我们可以获得它的源代码,并且可以按我们自己的需求进行修改。计算机视觉包括底层的图像处理、中层的图像分析以及高层的视觉技术,由于有很多计算机视觉大牛的开发维护,Opencv已经延伸到计算机视觉的每个领域,其功能几乎涵盖每个研究方向。而且,其实现的算法紧跟视觉前沿,将最新的技术算法也纳入其中。
Opencv功能十分强大,它在学术界和工业界的影响也越来越大。作为数值计算的经典——Matlab,同样是科研工作者在图像领域使用最多的工具之一。以前很多论文作者都是提供Matlab代码,由于Opencv特别是Opencv2.x的出现,大大方便了研究者在图像领域的C++编程,所以现在很多研究者都直接给出论文实现的C++代码了。Opencv(C++)之于Matlab的优势在于:在大多数情况,C++具有不错的效率。同时,用C++编程对研究者进入市场找工作有巨大的优势(相对Matlab)。在许多图像相关公司,它的要求也是希望求职者熟悉甚至精通Opencv。所以Opencv在图像界确实是相当重要的一个工具,是很多图像领域人极力推荐的。
二、 Opencv的几个模块简介
Opencv内部是通过模块来组成的,每个模块都能完成相应的功能。这里对Opencv内部的几个主要模块进行简单介绍。打开Opencv官方手册,我们可以看到它包括如下主要模块:1. core. The Core Functionality。这个模块是Opencv里面的基本数据结构,其中有Opencv的基石Mat,用来存储图像或者矩阵,还有其他诸如Point(点结构)、Size(Mat的长宽结构)等等。Opencv中的Mat封装了很多矩阵运算的方法,这使得我有时不由得觉得它是个类似Matlab的数值计算工具。完全可以利用Mat类来进行矩阵计算。
2. imgproc. Image Processing。这个模块是进行图像处理的,包括有滤波、直方图、特征检测等等。由于这些是图像处理的基础领域,Opencv对于这些算法的实现挺靠谱的。
3. highgui. High-level GUI and Media I/O。简单的Opencv界面,用来读取、输出数据,创建窗口等等。
4. video. Video Analysis。视频分析模块,包括运动分析和物体跟踪。
5. calib3d. Camera Calibration and 3D Reconstruction。相机矫正和三维重建模块。
6. ml. Machine Learning。Opencv中的机器学习模块,其中有统计学习模型、boosting、随机森林等等许多机器学习的算法。
7. contrib. Contributed/Experimental Stuff。这是个实验模块,其中的功能不一定稳定,但是比较前沿。其中有立体视觉、人脸识别等等。
这里主要罗列了其中的七个模块,由于本人并未对Opencv的每个模块都有过深入了解,所以对每个模块都没有进行展开讲。后期会对主要的模块进行学习,并与大家分享。剩下的模块还有nonfree. Non-free functionality、stitching. Images stitching、flann. Clustering and Search in Multi-Dimensional Spaces等等一些,大家可以自己查看Opencv的官方手册,后面也会出现在共享我的资料中。
三、 Opencv的使用
当Opencv进入2.x时代,它的使用已经很简单,很多函数都类似matlab,如imread,imwrite等等。2.x的封装性非常好,而且我们想要的功能,Opencv基本都有提供。我们直接把它作为API调用,使用起来何其方便。而且Opencv2.x让编程者摆脱了内存管理这个坑,我们可以把精力完全放在算法实现上。当然,作为Opencv的每一个模块,特别是那些非基层模块,它都是计算机视觉领域的一个研究方向,现有的Opencv功能不一定能满足我们的需求。个人对Opencv使用的一些想法是:利用Opencv的基础数据结构,如Mat,进行数据的读写等,Opencv可以读写jpg,bmp,ppm等等几乎所有常见的图像格式。我们实现功能或算法的关键部分可能调用Opencv的函数并不能满足效果,但我们可以用它的其他功能进行辅助。比如,滤波,直方图等等这些经典的图像处理,省得我们自己去写这些函数。
四、 Opencv的学习以及学习资料
Opencv作为一个计算机视觉的API,在学习中,我们有必要对理论进行了解,否则我们对函数做什么用都不知道。当然,反过来也可以,就是在进行理论学习时,我们可以查看对应理论在opencv中的函数实现,以加强理解。如果是做工程的童鞋,稍微了解那些理论就可以了,毕竟图像里面的水太深,很难趟过去啊(俺就是其中的一个悲剧)。还有一点,对于opencv里面的基本数据结构还是要熟悉啊。不要在完全不太了解得情况下,说用到就查查手册,这个是得对有一定基础的人。
在学习过程中,我也看了别人写的很多资料以及分享的资料,非常感谢这些乐于分享的人。这里我也介绍一下我的搜集的一些学习opencv或者视觉方面的资料吧(最后会给出我的共享),这里仅仅是罗列,并提出自己的一些观点,大家自己进行选择(在看这些资料之前,强烈建议先看官方文档里的Basic Structure,先对基础数据结构有一个了解)。
1、 opencv官方手册和教程,这里有opencv的详细文档,每个数据结构和函数的详细讲解。http://docs.opencv.org/trunk/index.html(英文官方文档),http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html(中文的教程,从英文tutorial翻译过来的)。
2、 http://www.opencv.org.cn/#(opencv中文论坛)、http://www.sigvc.org/bbs/forum.php(视觉计算研究论坛)
3、 《学习Opencv(中文版)》,这本书主要针对opencv1.x的,介绍的很详细,但由于是1.x的,我不太推荐,不过它其中的有些理论性的介绍值得一看(可以当资料书查看吧)。
4、 《OpenCV 2 Computer Vision Application Programming Cookbook - Lagani》,这本书是第一本关于介绍opencv2.x的非官方书籍,外国人写的书,通俗易懂,而且附带源代码。现在已经被翻译成中文了,不过个人还是建议读英文原版,一本写的不错的小册子。
5、 《Mastering OpenCV with Practical Computer Vision Projects》,这本书通过八个简单的Opencv工程来带我们进入Opencv,当然,这个需要我们有一定的Opencv基础(付源代码)。
6、 《Practical Opencv》,这本书是新看到的书籍,所以没有太多了解。我大概翻了一下,主要分为两部分,一个是opencv的基础部分,另一部分是进阶部分。作者的主要内容是以机器视觉为主线的,如果有童鞋对opencv在机器视觉中的应用感兴趣的,可以看看。
好了,这篇opencv简介算是写完了,下面给出共享上面提到的书籍电子版的网址(大部分包括源码):
http://download.csdn.net/detail/shiyimin1/7331207(opencv官方手册电子书)
http://download.csdn.net/detail/shiyimin1/7331187(上面提到的三本书共享下载地址)