OpenCV是一个开源的计算机视觉库,具有模块化。

模块 说明
core 核心模块,包括基本的数据结构,例如cv::Mat。
imgproc 图像处理模块,包括图像过滤、图像转换、颜色空间转换和直方图等。
video 视频分析模块,包括运行估计、背景减法和对象跟踪算法等。
calib3d 基本的多视图几何算法、单一和立体摄像机标定、 对象的姿势估计、 立体声函授算法和元素的三维重建。
features2d 特征探测器
objdetect 对象检测,可做人脸识别、汽车识别等对象识别功能。
highgui 用户界面接口。
gpu GPU加速算法。

API概念

cv命名空间

所有的OpenCV类和函数都放在cv命名空间中,因此要使用OpenCV中的类或函数需要使用cv命名空间来访问。

cv::Mat A;

如果与stl或其它库的名称冲突则需要显式命名空间来访问。

cv::log(1)
std::log(1)
自动内存管理

OpenCV自动处理所有内存

OpenCV通过引用计数的方式来进行内存自动管理

Mat A(1000, 1000, CV_64F);  // 创建一个新的Mat对象
Mat B = A;                  // B引用A
Mat C = B.clone();          // 克隆B赋给C,此时C是一个新对象,操作不会影响到A
Mat D;
C.copyTo(D);                // 拷贝C给D,此时D是一个新的对象,操作不会影响到C
自动释放与分配输出数据

OpenCV 自动释放内存,以及自动分配的内存为输出函数参数的大部分时间。

饱和度算法

cv::uchar是8位无符号整数类型

模块
类型 说明 对应的枚举值 多通道
uchar 8位无符号整数 CV_8U=0 CV_8UC(n)
schar 8位有符号整数 CV_8S=1 CV_8SC(n)
ushort 16位无符号整数 CV_16U=2 CV_16UC(n)
short 16位有符号整数 CV_16S=3 CV_16SC(n)
int 32位有符号整数 CV_32S=4 CV_32SC(n)
float 32位浮点数 CV_32F=5 CV_32FC(n)
double 64位浮点数 CV_64F=6 CV_64FC(n)

多通道也可以使用CV_MAKETYPE函数来创建,例如 CV_MAKETYPE(CV_8U, n)

Mat mtx(3, 3, CV_32F); // 创建3x3浮点矩阵
Mat cmtx(10, 1, CV_64FC2); // 创建10x1双通道浮点矩阵,10元素复杂向量
Mat img(Size(1920, 1080), CV_8UC3); // 创建1920列,1080行的3通道颜色的图像
Mat grayscale(image.size(), CV_MAKETYPE(image.depth(), 1)); // 创建与image同大小,同通道类型的单通道图像

人脸识别算法能适用于8位灰度图像或彩色图像

异常处理
try
{
    ... // call OpenCV
}
catch( cv::Exception& e )
{
    const char* err_msg = e.what();
    std::cout << "exception caught: " << err_msg << std::endl;
}
多线程

OpenCV直接在多线程中访问同一个Mat对象,通过引用计数的方式,达到内存共享。

参考: http://docs.opencv.org/modules/core/doc/intro.html