Opencv基本数据类型主要包括:cv::Vec、cv::Point、cv::Size、cv::Scalar、cv::Rect、cv::Matx、cv::Range等。
1 Point类
cv::Point{2,3}{b,s,i,f,d},2、3代表维度,在这里b是一个无符号字符,s是一个短整型,i是一个32位整型,f是一个32位浮点数,d是一个64位浮点数。Point类的成员通过名称变量访问,如mypoint.x,mypoint.y等。
1.1 Point类支持的操作:
默认构造函数:cv::Point2i p;cv::Point3i p;
复制构造函数:cv::Point3f p2(p1);
值构造函数:cv::Point2i(x0,x1);cv::Point3d p(x0,x1,x2);
构造成固定向量类:(cv::Vec3f)p;
成员访问:p.x ,p.y;
点乘:float x = p1.dot(p2);
双精度点乘:double x =p1.ddot(p2);
叉乘:p1.cross(p2);
2 Scalar类
cv::Scalar本质上是一个四维Point类,与Point类相似,cv::Scalar实际上与一个可以产生任意四元素向量的模板相关,但cv::Scalar一般是双精度四元素向量的别名。
2.1 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(s0,-s1,-s2,-s2)
(四元数)真值测试:s.isReal();//return ture, if s1==s2==s3==0
3 Size类
size类在实际操作时与Point类相似,而且可以与Point类相互转换。这两者间主要区别在于Point类的数据成员是x和y,而size类中对应的成员是width和height。size类的三个别名分别是cv::Size,cv::Size2i,cv::Size2f。前面两个是等价的,表示整数大小,而最后一个是表示32位浮点大小。
3.1 Size类支持的操作:
默认构造函数:cv::Size sz;cv::Size2i sz;cv::Size2f sz;
复制构造函数:cv::Size sz2(sz1);
值构造函数:cv::Size2f sz(w,h);
成员访问:sz.width;sz.height;
计算面积:sz.area();
4 Rect类
Rect类包含Point类的成员x和y(矩形左上角)和Size类的成员width和height(代表了矩形的大小)。
4.1 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(),r.br();
判断p点十分在矩形r内:r.contains(p);
4.2 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;
扩大矩形r s大小:cv::Rect rs = r+s;r+=s;
比较矩形r1和矩形r2是否相等和不相等:bool eq = (r1==r2);bool ne = (r1 != r2);
5 固定矩阵类cv::Matx
固定矩阵类是为了编译时就已知维度的矩阵所设计的,它的内部所有数据都是在堆栈上分配的。固定矩阵类是Opencv的c++接口基本类型的核心。固定向量类继承自固定矩阵类,而其他类的操作,要么继承自固定向量类,要么依赖于转换成固定向量类。固定矩阵类实际上一个模板。这个模板称为cv::Matx<>,但独立的矩阵通常通过别名分配。这些别名的基础格式为cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d}。
5.1 Matx类支持的操作:
默认构造函数:cv::Matx33f m22f;cv::Matx43d m43d;
复制构造函数:cv::Matx22d m22d(n22d);
值构造函数:cv::Matx21f m(x0,x1);
含相同元素的矩阵:m33f = cv::Matx33f::all(x);
全零矩阵:m23d = cv::Matx23d::zeros();
元素全是1的矩阵:m16f = cv::Matx16f::ones();
单位矩阵:m33f = cv::Matx33f::eye();
均匀分布矩阵:m33f = cv::Matx33f::randu(min,max);
正态分布矩阵:m33f = cv::Matx33f::nrandu(mean,variance);
成员访问:m(i,j),m(i);
矩阵能正常的进行加减乘除;
点积:m1.dot(m2) m1.ddot(m2);
变换操作符:m44f = (Matx44f) m44d;
提取(i,j)处的2*2子矩阵:m44f.get_minor<2,2>(i,j);
提取第i行或者j列:m14f = m44f.row(i),m41f = m44f.col(j);
提取矩阵的对角线:m41f = m44f.diag();
计算矩阵转置:n44f = m44f.t();
计算矩阵的逆:n44f = m44f.inv(method);
每个元素的乘法:m1.mul(m2);
6 固定向量类
固定向量类的形式为cv::Vec{2,3,4,6}{b,s,w,i,f,d} s是一个短整型,i是一个32位整型,f是一个32位浮点数,d是一个64位浮点数,w表示unsigned short。
6.1 cv::Vec支持的操作:
默认构造函数:cv::Vec2s v2s;
复制构造函数:cv::Vec3f u3f(v3f);
值构造函数:cv::Vec2f v2f(x0,x1);
成员访问:v4f[i];v3w(j) //[] 和()都是可以的
向量叉乘:v3f,cross(u3f);
7 Range类
cv::Range类用于确定一个连续的整数序列。cv::Range有两个元素start和end。构造函数cv::Range(int start,int end)范围包含初始值start,但不包括终止值end,因此cv::Range rng(0,4)包含0,1,2,3但是不包含4。rng.size()输出range类的元素数量,成员函数empty()测试一个range十分含有元素。