OpenCV的数据类型——基础数据类型

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类。

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>)中继承而来,所以继承了所有向量代数操作、成员访问函数(比如[]操作符)和一些固定向量类的特性,如:其元素是通过整数下标来访问的。

Scalar类直接支持的操作
操作 示例
默认构造函数 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,其中前两个都表示整型,最后一个表示单精度浮点型。

Size类直接支持的操作
操作 示例
默认构造函数

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(代表矩形的大小),但并非从它们继承过来。

Rect类直接支持的操作
操作 示例
默认构造函数

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 );
Rect对象的覆写操作符
操作 示例
矩形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的容器(表示图形绕中心点的旋转角度)。

RotatedRect类直接支持的操作
操作 示例
默认构造函数 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::Matx类支持的操作
操作 示例
默认构造函数

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 );
method:矩阵分解类型
名称 描述
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 LL^{T} factorization; the matrix src1 must be symmetrical and positively defined

柯列斯基LL^{T}分解;矩阵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 src1^{T}\cdot src1\cdot dst=src1^{T}src2 are solved instead of the original system src1\cdot dst=src2

虽然前面所有的标志都是互斥的,但是这个标志可以和前面的任何一个一起使用;这意味着解的是正规方程src1^{T}\cdot src1\cdot dst=src1^{T}src2而不是原来的方程src1\cdot dst=src2

固定向量类

固定向量类cv::Vec是从固定矩阵类派生出来的,从C++继承的意义上,可以说固定向量模板cv::Vec是列为1的cv::Matx<>。其特例的形式为cv::Vec{2,3,4,6}{b,s,w,i,f,d}(w是无符号短整型),主要遍历方式是通过单个数索引各项。

cv::Vec类支持的操作
操作 示例
默认构造函数

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();

猜你喜欢

转载自blog.csdn.net/godadream/article/details/81670495