写这篇文章时,我选择的OpenCV版本是2.4.8。尽管在前面的文章中编译了最新的OpenCV源码,但最新的可能不是稳定版本,写文章的话还是选择一个固定版本为好。在后面的文章中,如果发布了新版本,我会选择使用,总之,写文章时使用的都是最新的稳定版本。

首先应该了解OpenCV 1.x和OpenCV2.x是有很大差别的。OpenCV1.x使用的是C接口,需要手动管理内存,所有的函数都装到单一的库中,在使用时需要将整个巨大的OpenCV库都装入你的程序中。OpenCV2.x引入了新的C++接口,实现了自动内存管理,使用新的图像数据结构Mat代替了就得CvMat和IplImage,并且将功能进行分模块,所以OpenCV2.x是由很多模块组成的,这样在使用时只需要引入需要的库即可。

在写程序时,用到什么功能就需要包含进相应的头文件。所有的头文件都在/include/opencv2文件夹找到,这里列举一些比较重要的:

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"

如果不知道引入什么头文件,那么就使用

#include <opencv2\opencv.hpp>

下面简单介绍一下各个模块的作用:

  • core:通过名字就可以看出它是核心模块,定义了基本的数据结构和算术函数;
  • imgproc:该模块包括了线性和非线性的图像滤波,图像的几何变换,颜色空间转换,直方图处理等等;
  • video:该模块包括运动估计,背景分离,对象跟踪;
  • highgui:视频捕捉、图像和视频的编码解码、图形交互界面的接口;
  • calib3d:基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建;
  • features2d:显著特征检测,描述,特征匹配;
  • objdetect:物体检测和预定义好的分类器实例(比如人脸,眼睛,面部,人,车辆等等);
  • ml:机器学习模块(SVM,决策树,Boosting等等);;
  • gpu:利用GPU对OpenCV模块进行加速算法;
  • contrib:实现了多种目标跟踪算法,包括featuretracker、hybridtracker和detection_based_tracker等;

OpenCV所有的类和函数都在cv命名空间下,在使用时有2种方式。

  1. 在include头文件之后使用using namespace cv
    #include "opencv2/core/core.hpp"
    using namespace cv;
    int main()
    {
    	Mat frame = cvQueryFrame(capture);
    	imshow("Video", frame);
    }
  2. 在OpenCV类,函数,数据结构之前加上域操作符cv::
    #include "opencv2/core/core.hpp"
    
    int main()
    {
    	cv::Mat frame = cvQueryFrame(capture);
    	cv::imshow("Video", frame);
    }

本篇文章大体了解了一下OpenCV的组成,以及在使用时的一些简单的用法,稍微了解即可,下一篇文章说一下OpenCV最重要的数据结构Mat。