文章目录

  • Point类
  • cv::Scalar类
  • size类
  • cv::Rect类
  • cv::RotatedRect类
  • 固定矩阵类
  • 固定向量类
  • 复数类
  • 工具函数
  • 模板结构


Point类

  • 在大多数程序中,Point类是通过类似于cv::Point2i和cv::Point3f这类别名来实例化的,这些别名的最后一个字母表示构造该点所需要的原语(在这里,b是一个无符号字符,s是一个短整型,i是一个32位整型,f是一个32位浮点数,d是一个64位浮点数)。
  • 表3-1是Point类原生支持的函数列表(相对较短)。注意,这里有几个非常重要的受支持的操作,但它们是间接地通过隐式转换到固定向量类而受支持(在固定向量类中介绍)。这些操作显著包含所有的向量(vector)和标量(singleton),些重载了线性代数的操作符以及比较操作符。

cv::Scalar类

  • cv::Scalar是四维点类。与其他类型类似,它实际上与一个模板类相关,但访问它的别名返回一个该模板的实例,在这个模板中,所有的成员都是双精度浮点数。在计算机视觉中,cv::Scalar类有一些与四元向量相关的特殊成员函数。表3-2列举了一些cv::Scalar支持的操作。

size类

  • size类在实际操作时与Point类相似,而且可以与Point类互相转换。这两者之间主要的区别在于Point类的数据成员是x和y,而size类中对应的成员是width和height。size类的三个别名分别是cv::Size,cv::Size2i,cv::Size2f。前面两个是等价的,表示整数大小,而最后一个是表示32位浮点大小。与Point类相似,size类可以与对应的旧类型的OpenCV类(CvSize和CvSize2D32f)互相转换。表3-3列举了size类支持的操作。

cv::Rect类

  • 矩形类包含Point类的成员x和y (矩形左上角)和size类的成员width和height(代表了矩形的大小)。然而矩形类并不是从Point类或size类继承过来的,所以它并没有从它们那里继承操作(表3-4)。
  • 表3-5显示,cv::Rect也支持一系列的覆写操作符,它们可以用于计算两个矩形、一个矩形或别的对象的各种各样的几何特性。

cv::RotatedRect类

  • cv::RotatedRect类是OpenCV中少数底层没有使用模板的C++接口类之一。同时,它是包含一个中心点cv::Point2f、一个大小cv::Size2f和一个额外的角度float的容器。其中浮点类型(float)的角度代表图形绕中心点旋转的角度。cv::RotatedRect和cv::Rect有一个非常重要的不同点是cv::RotatedRect是以中心为原点的,而cv::Rect则位于左上角为原点。表3-6列举了cv::RotatedRect类直接支持的操作。

固定矩阵类

  • 固定矩阵类是为编译时就已知维度的矩阵打造的,这也是它称为“固定”的原因。因为它们内部的所有数据都是在堆栈上分配的,所以它们的分配和清除都很快。对固定矩阵类的操作运行很快,而且它们还在小型矩阵(2×2,3×3,等等)上做过特别的优化。固定矩阵类同时也是在OpenCV的C++接口中基本类型的核心。固定向量类继承自固定矩阵类,而其他类的重要操作,要么是继承自固定向量类(类似cv::Scalar) ,要么是依赖于转换成固定向量类。通常,固定矩阵类实际上是一个模板。这个模板称为cv::Matx<>,但独立的矩阵则通常通过别名分配。这些别名的基础格式是cv::Matx{1,2,…]{1,2,…}{f,d},其中的数字可以是1到6之间的任何数,尾部的字母与之前的类型—样。
  • 一般来说,当你要表示一个用来处理矩阵代数的矩阵的时候,你就会用到固定矩阵类。而如果你的对象是一个像图像或大型点列表这样的大数组,使用固定矩阵类就不是个好主意。这种情况下你应该使用cv::Mat。固定矩阵类是你在编译的时候就知道矩阵大小的时候使用的(比如相机矩阵)。表3-7列举了cv::Matx支持的操作。

opencv 点是否在轮廓中_opencv 点是否在轮廓中

  • 注意,很多固定矩阵的函数相对类是静态的(比如,你访问它们是作为类而不是特定对象的成员)。举个例子,如果想构造一个3×3的单位矩阵,这有一个方便的类函数cv::Mat33f::eye()。注意,在这个例子中,eye()不需要任何参数,因为它是类的成员,并且已经是cv ::Matx<>模板的3×3实例。

固定向量类

  • 固定向量类是从固定矩阵类派生出来的。它们其实只是为了更方便地使用cv::Matx<>。在C++继承的意义上,可以说固定向量模板cv;:Vec是列为1的cv::Matx<>。为特定实例准备好的别称有这样的形式cv::Vec{2,3,4,6}{b,s,w,I,f,d},最后一个字母意义如前文所述(另外加上w,表示unsigned short)。表3-8展示了cv::Vec支持的操作。

复数类

  • 还有一个应该包含在基础类型中的类,它就是复数类。OpenCV的复数类与STL复数类模板complexc>不一样,但是与之兼容,可以相互转换。它们最大的区别在于成员获取。在STL类中,虚部和实部是通过成员函数real()和imag()获取的,而在OpenCV中,直接通过成员变量re和im获取。表3-9列出了复数类支持的操作。

工具函数

  • 除了本章前面所提供的专门的原始数据类型外,OpenCV库还提供了一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。在库的环境中,它们被称为工具函数。工具函数包含数学操作、测试、错误生成、内存与线程处理、优化及其他的工具。表3-10列举了这些函数并概括了它们的功能,详细描述紧随其后。

模板结构

  • OpenCV 2.1版本以及后续的版本建立在类似于STL、boost及其他类似库的模板元编程风格之上。这些库的设计十分强劲,不管是在质量上还是速度上都非常领先,并且对开发者保持了最大限度的自由。从惯例来说,OpenCV中所使用的模板结构允许算法以一种抽象的形式表达并且不需要依赖于C++的基本结构,甚至不依赖于OpenCV的基本结构。
  • 我们从cv::Point类开始。尽管这个类是作为基本类型介绍的,但是当你实例化一个cv::Point类的时候,实际上是在实例化一个更基础的类cv::Point_。显然,这个模板不仅可以以int类型初始化而且可以以支持如同int类型的基本操作的任何类型初始化。比如说,OpenCV提供了类型cv::Complex,你也可能使用过OpenCV的复数完全不一样的STL的复数类型std::complex。对于其他的自己构造的类型也是如此。同样的概念可以推广到cv::Scalar_<>以及cv::Rect_<>,cv::Matx_<>和cv: :Vec_<>。
  • 当实例化自己这些模板的时候,必须提供实例化类型以建立模板以及模板的维度。通用模板的参数如表3-11所示。