Learning OpenCV with CPP -- Base Data Type
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类型可通过点操作符直接访问其成员。同时,它支持dot
和cross
操作。特别地,通过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相互转换。
未完待续。。。