FEI的日志
793 字
4 分钟
OpenCV - 简介
2017-02-13

简介#

OpenCV是一个开源的,基于BSD-licensed集成百上千个视觉算法的库。

OpenCV是模块化设计的,所以有几个共享或者静态库:

  • Core functionality - 基础库
  • Image processing - 线性和非线性图片滤镜,几何转换,色彩域转换,直方图
  • video - 动作预测,物体捕捉算法
  • calib3d - 多视图几何算法,单个或者多个拍照校准,物体姿势估计等等
  • features2d - 突出特征检测,特征匹配
  • objdetect - 预设物体检测
  • highgui - 简单的UI能力
  • Video I/O - 简单的视频编解码
  • gpu - 不同模块的GPU加速算法

CV命名空间#

所有的OpenCV类和方法都放在cv命名空间之下,所以使用如下:

cv::Mat m = ...;
//或者如下
using namespace cv;
Mat m = ...;

自动垃圾回收#

类似于std::vector,Mat和一些其他的OpenCV用到的基础数据结构都支持自动垃圾回收的,如果不是基础数据结构,而是用户自定义的,比如T* t = new T(...);,我们可以通过下面方法使其支持自动回收:Ptr<T> ptr(new T(...));或者Ptr<T> ptr = makePtr<T>(...);

自动回收Output Data#

饱和算法(Saturation Arithmetics)#

作为一个视觉库,OpenCV需要处理大量的图像像素,他们通常会以8-16位的紧凑方式编入每个通道,形成具有最大值和最小值的区间范围,刺猬还有一些比如色彩域转换,亮度,对比度调整,锐化,复杂的插值等,这将可能导致超出有效值的数值,为了避免这种情况,饱和算法被用与此,它始终保证一个8位的数值在0..255的范围内的最靠近的数值:

I(x,y) = min(max(round(r),0),255)

在OpenCV中的用法如下:

I.at<uchar>(y,x) = saturate_cast<uchar>(r);

其中uchar是一个8位的无符号整形

饱和算法不适用于32位整形

固定的像素类型,限制使用模板#

OpenCV不允许使用模板 OpenCV支持的元组数据类型有:

  • 8-bit unsigned integer(uchar)
  • 8-bit signed integer(schar)
  • 16-bit unsigned integer(ushort)
  • 16-bit signed integer(short)
  • 32-bit signed integer(int)
  • 32-bit floating-point number(float)
  • 64-bit floating-point number(double)
  • 一个元组中的多个元素里的所有的元素具有相同的类型,一个队列中的所有元素可以是元组,相对单通道而言被称作多通道队列,他们的元素是数量值。

InputArray 和 OutputArray#

OpenCV的方法处理二维数组或者多维数据通常会以cppMat为参数,但是一些情况下使用std::vector或者Matx<>更方便,为了避免Api的重复,“代理”类被引用,InputArray用于在方法输入上传只读数组,OutputArray继承自InputArray,被用于指定一个输出队列。

异常处理#

OpenCV使用Exception提示严重错误,一般会返回错误码的方式通知。

Exception通常以CV_Error(errcode,description)的方式抛出。

CV_Assert(condition)用于检测特定情况,如果不满足抛出异常

CV_DbgAssert(condition)只有在Debug模式时起作用

多线程重入#

OpenCV完全支持多线程重入,类似cv::Mat可以使用在不同线程中,因为引用技术使用的是原子操作。