OpenCV有很多数据类型,从组织结构的角度来看,OpenCV的基础类型类型主要分为三类。第一类是直接从C++原语中继承的基础数据类型;第二类是辅助对象;第三类是大型数据类型。本文主要介绍OpenCV的基础数据类型。
目录
Point类
Scalar类
Size类
Rect类
RotatedRect类
固定矩阵类
固定向量类
复数类
Point类
cv::Point类是两到三个原语类型的容器,其成员是通过变量名称x、y、z访问的,而不是通过下标访问。Point类是通过自己的模板派生来的,这是一个基础模板;实际上由两个这样的模板,分别是给二维、三维的点提供的。这些类的实例有cv::Point2i、cv::Point2f、cv::Point2d或cv::Point3i、cv::Point3f、cv::Point3d(在这里,最后一个字母表示构造该点所需要的原语,i是一个32位整形,f是一个32位浮点数,d是一个64位浮点数,还可以有无符号字符b和短整型s)。
优势:简单且开销小。Point类可以转换成固定向量类或固定矩阵类,同样也可由它们转换得到Point类。
操作 | 示例 |
---|---|
默认构造函数 | cv::Point2i p2; cv::Point3i p3; |
复制构造函数 | cv::Point3i p1( p ); 注:若p为浮点型,则会自动取整 |
值构造函数 | cv::Point2i( x0, x1 ); cv::Point3d( x0, x1, x2 ); |
构造成固定向量类 | (cv::Vec3f) p; |
成员访问 | p.x, p.y, p.z |
点乘 | float x = p1.dot( p ); |
双精度点乘 | double x = p1.dot( p ); |
叉乘 | p1.cross( p ); 注:只用于三维的点 |
判断一个点p是否在矩形r内 | p1.inside( r ); 注:只用于二维的点 |
Scalar类
cv::Scalar是四维点类,是四维双精度向量的快速表示。cv::Scalar直接从固定向量类模板实例(cv::Vec<double, 4>)中继承而来,所以继承了所有向量代数操作、成员访问函数(比如[]操作符)和一些固定向量类的特性,如:其元素是通过整数下标来访问的。
操作 | 示例 |
---|---|
默认构造函数 | cv::Scalar s; |
复制构造函数 | cv::Scalar s2( s1 ); |
值构造函数 | cv::Scalar s( x0 ); cv::Scalar s( x0, x1, x2, x3 ); |
元素相乘 | s1.mul( s2 ); |
(四元数)共轭 | s.conj(); // return cv::Scalar( x0, -x1, -x2, -x3 ); |
(四元数)真值测试 | s.isReal(); // if x1 == x2 == x3 == 0{ return true; } |
Size类
Size类在实际操作时和Point类相似,可以进行互相转换。主要区别在于Size类中对应的成员是width和height,而不是x和y,并且不支持转换到固定向量类。Size类的别名有cv::Size、cv::Size2i和cv::Size2f,其中前两个都表示整型,最后一个表示单精度浮点型。
操作 | 示例 |
---|---|
默认构造函数 | cv::Size sz; cv::Size2i sz; cv::Size2f sz; |
复制构造函数 | cv::Size2f sz2( sz1 ); |
值构造函数 | cv::Size2f sz( w, h ); |
成员访问 | sz.width; sz.height; |
计算面积 | sz.area(); |
Rect类
Rect类又称矩形类,包含Point类的成员x和y(代表矩形左上角的坐标)和Size类的成员width和height(代表矩形的大小),但并非从它们继承过来。
操作 | 示例 |
---|---|
默认构造函数 | cv::Rect r; |
复制构造函数 | cv::Rect r2( r1 ); |
值构造函数 | cv::Rect( x, y, w, h ); |
由起始点和大小构造 | cv::Rect( p, sz ); |
由两个对角构造 | cv::Rect( p1, p2 ); |
成员访问 | r.x; r.y; r.width; r.height; |
计算面积 | r.area(); |
提取左上角 | r.tl(); // top-left |
提取右下角 | r.br(); // bottom-left |
判断点p是否在矩形r内 | r.contains( p ); |
操作 | 示例 |
---|---|
矩形r1和矩形r2的交集 | cv::Rect r3 = r1 & r2; r1 &= r2; |
同时包含矩形r1和矩形r2的最小面积矩形 | cv::Rect r3 = r1 | r2; r1 |= r2; |
平移矩形r x个数量 | cv::Rect rx = r + x; r += x; // x为一个Point实例,左上角偏移量 |
扩大矩形r s大小 | cv::Rect rs = r + s; r += s; // s为一个Size实例,尺寸改变量 |
比较矩形r1和矩形r2是否相等 | bool eq = ( r1 == r2 ); |
比较矩形r1和矩形r2是否不相等 | bool ne = ( r1 != r2 ); |
RotatedRect类
cv::RotatedRect类是OpenCV中少数底层没有使用模板的C++接口之一。它是一个包含一个中心点cv::Point2f、一个大小cv::Size2f和一个额外的角度float的容器(表示图形绕中心点的旋转角度)。
操作 | 示例 |
---|---|
默认构造函数 | cv::RotatedRect rr(); |
复制构造函数 | cv::RotatedRect rr2( rr1 ); |
值构造函数,需要一个点(point)、 一个大小(size)和一个角度(angle) | cv::RotatedRect rr( p, sz, theta ); |
成员访问 | rr.center; rr.size; rr.angle; |
返回四个角的列表 | rr.points( pts[4] ); |
包含旋转矩形的最小矩形 | rr.boundingRect(); |
固定矩阵类
固定矩阵类cv::Matx<>的维度在编译之前必须知道,因此被称为“固定”。它们内部的所有数据都是在堆栈上分配的,所以分配和消除的很快,消除了许多动态内存分配操作,运行效率高。cv::Matx<>一般都以别名cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d}的形式应用,适用于小型矩阵,并做了特别的优化。
操作 | 示例 |
---|---|
默认构造函数 | cv::Matx33f m33f; cv::Matx43d m43d; |
复制构造函数 | cv::Matx22d m22d( n22d ); |
值构造函数 | cv::Matx21f m( x0, x1); cv::Matx44d m( x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 ); |
函相同元素的矩阵 | m33f = cv::Matx33f::all( x ); |
全0矩阵 | m23d = cv::Matx23d::zeros(); |
全1矩阵 | m16f = cv::Matx16f::ones(); |
创建一个单位矩阵 | m33f = cv::Matx33f::eye(); |
创建一个可以容纳另一个矩阵对角线的矩阵 | m31f = cv::Matx31f::diag(); |
创建一个均匀分布的矩阵 | m33f = cv::Matx33f::randu( min, max ); |
创建一个正态分布的矩阵 | m33f = cv::Matx33f::nrandn( mean, variance ); |
成员访问 | m( i, j); m( i ); |
矩阵代数运算 | m1 = m0; m0 * m1; m0 + m1; m0 - m1; |
单例(singleton)代数 | m * a; a * m; m / a; |
比较 | m1 == m2; m1 != m2; |
点积 | m1.dot( m2 ); // 使用默认精度运算法求点积 |
点积 | m1.ddot( m2 ); // 使用双精度运算法求点积 |
改变矩阵形状 | m91f = m33f.reshape<9, 1>(); |
变换操作符 | m44f = (Mat44f) m44d; |
提取(i, j)处的2×2子矩阵 | m44f.get_minor<2, 2>( i, j ); |
提取第 i 行 | m14f = m44f.row( i ); |
提取第 j 列 | m41f = m44f.col( j ); |
提取矩阵对角线 | m41f = m44f.diag(); |
计算转置 | n44f = m44f.t(); |
逆矩阵 | n44f = m44f.inv( method ); // method为矩阵分解类型,默认为cv::DECOMP_LU |
解线性系统 | m31f = m33f.solve( rhs31f, method); m32f = m33f.solve<2>( rhs32f, method); |
每个元素的乘法 | m1.mul( m2 ); |
名称 | 描述 |
---|---|
DECOMP_LU | Gaussian elimination with the optimal pivot element chosen. 选择了最优主元的高斯消去法。一定不能是单数的。 |
DECOMP_SVD | singular value decomposition (SVD) method; the system can be over-defined and/or the matrix src1 can be singular 奇异值分解(SVD)方法;系统可以被过度定义和/或者矩阵src1可以是单数。 |
DECOMP_EIG | eigenvalue decomposition; the matrix src1 must be symmetrical 特征值分解;矩阵src1必须是对称的。 |
DECOMP_CHOLESKY | Cholesky factorization; the matrix src1 must be symmetrical and positively defined 柯列斯基分解;矩阵src1必须是对称的并是正定矩阵。该类型在处理大的矩阵时的速度是LU的两倍左右。 |
DECOMP_QR | QR factorization; the system can be over-defined and/or the matrix src1 can be singular QR分解;系统可以被过度定义和/或者矩阵src1可以是单数。 |
DECOMP_NORMAL | while all the previous flags are mutually exclusive, this flag can be used together with any of the previous; it means that the normal equations are solved instead of the original system 虽然前面所有的标志都是互斥的,但是这个标志可以和前面的任何一个一起使用;这意味着解的是正规方程而不是原来的方程。 |
固定向量类
固定向量类cv::Vec是从固定矩阵类派生出来的,从C++继承的意义上,可以说固定向量模板cv::Vec是列为1的cv::Matx<>。其特例的形式为cv::Vec{2,3,4,6}{b,s,w,i,f,d}(w是无符号短整型),主要遍历方式是通过单个数索引各项。
操作 | 示例 |
---|---|
默认构造函数 | cv::Vec2s v2s; cv::Vec6f v6f; |
复制构造函数 | cv::Vec3f u3f( v3f ); |
值构造函数 | cv::Vec2f v2f( x0, x1); cv::Vec6d v6d( x0, x1, x2, x3, x4, x5 ); |
成员访问 | v4f[ i ]; v3w( j ); |
向量叉乘 | v3f.cross( u3f ); |
复数类
cv::Complexf和cv::Complexd分别是单精度和双精度复数的别名。
操作 | 示例 |
---|---|
默认构造函数 | cv::Complexf z1; cv::Complexd z2; |
复制构造函数 | cv::Complexf z2( z1); |
值构造函数 | cv::Complexf z1( re0); cv::Complexf z2( re0, im1); |
成员访问 | z1.re; z1.im1; |
复共轭 | z2 = z1.conj(); |