Contents
  1. 1. OpenCV学习路线(1)—— 基本数据类型
    1. 1.1. 基本情况
    2. 1.2. 基础类型
      1. 1.2.1. 固定矩阵类型cv::Matx
      2. 1.2.2. 固定向量类型cv::Vec
      3. 1.2.3. 点类型cv::Point
      4. 1.2.4. cv::Scalar类型
      5. 1.2.5. cv::Size类型

OpenCV学习路线(1)—— 基本数据类型

基本情况

  • 基本容器多为固定容量,容量可于创建时指定
  • 运算效率较高
  • OpenCV根据容器的不同容量定义了许多类型别名
  • 在使用时多使用类型别名以提高开发速度与可读性

基础类型

固定矩阵类型cv::Matx

Matx处于基本数据类型继承树的最顶端,其他基本容器多由它继承而来或使用它及它的派生类实现。Matx用于储存已知容量的小型数组。它的主要操作列表如下:

功能 示例
默认构造 Matx<4, 4, float> mat44f; Matx34d mat34d;
拷贝 Matx22d mat22d(other);
值构造 Matx23d mat23d(x1, x2, x3, x4, x5, x6);
含相同元素的矩阵 m1.all(m2);
全一矩阵 Matx22d.ones();
全零矩阵 Matx22d.zeros();
单位阵 Matx33d.eye();
随机阵 Matx34d.randu(); //均匀分布 Matx34d.nrandn(); // 正态分布
成员访问 m(i); //针对一维数组 m(i, j); //针对二维数组
运算与比较 直接使用运算符号
点积 m1.dot(m2); m1.ddot(m2); //双精度
改变形状 mat19f = mat33f.reshape<1, 9>();
类型转换 mat33f = (Matx33f)mat33d;
在(i, j)处获取n * m的子矩阵 mat44f.get_minor<n, m>(i, j);
提取第i行/列 mat44f.row/col(i);
提取对角线 mat44f.diag();
转置 mat34f.t();
逆矩阵 mat33d.inv(method); //method为计算方法,默认为高斯法
元素逐一相乘 m1.mul(m2);

类型别名命名形式为Matxabc
其中 a, b为维度,c为数据类型(f->float; d->double)

固定向量类型cv::Vec

Vec类继承自Matx类。准确来说,它继承自Matx<_Tp, cn, 1>,即一个一维数组。Vec支持使用下标访问元素,当然,像一维Matx一样通过括号访问也是可以的(见上节表格)。此外,三维Vec还支持向量的叉乘:vec3d1.cross(vec3d2);

Vec类型别名的命名格式为Vec{2, 3, 4, 6}{b, f, w, I, s, d}其中,s表示short而w表示unsigned short

点类型cv::Point

Point是OpenCV中最简单的数据类型,它是Point2i的类型别名。在使用时,通常使用类型别名进行操作,如Point{2, 3}{i, f, d}

Point类型可通过点操作符直接访问其成员。同时,它支持dotcross操作。特别地,通过p.inside(r)可判断点p是否在矩形r内。

cv::Scalar类型

Scalar类型可以理解为是一个四维的点,但它实际上通过继承一个cv::Vec< _Tp, 4 >实现。它可以通过mul(s2)函数与另一个Scalar类型进行逐元素相乘的运算;通过conj()函数进行共轭运算;通过isReal()进行真值检验(即判断s1, s2, s3是否全部等于0)。

cv::Size类型

Size类型类似于一个二维Point,且可用与Point相互转换。

未完待续。。。

Contents
  1. 1. OpenCV学习路线(1)—— 基本数据类型
    1. 1.1. 基本情况
    2. 1.2. 基础类型
      1. 1.2.1. 固定矩阵类型cv::Matx
      2. 1.2.2. 固定向量类型cv::Vec
      3. 1.2.3. 点类型cv::Point
      4. 1.2.4. cv::Scalar类型
      5. 1.2.5. cv::Size类型