cv::Matx<>在编译前必须知道其维度,维度有{1,2,3,4,6},其用途并不是用于大型数组的,只适用于一些3*3,4*4之类的小型数组,
其别名为cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d},如cv::Matx33f,cv::Matx22d等。
操作 | 示例 |
默认构造函数 | cv::Matx33f m33f; cv::Matx43d m43d; |
复制构造函数 | cv::Matx22d m22d(n22d); |
值构造函数 | cv::Matx21f m(x0, x1); cv::Matx44d m(x0,x1,x2...x15)(共16项) |
含相同元素的矩阵 | m33f = cv::Matx33f::all(x); |
全零矩阵 | m23d = cv::Matx23d::zeros(); |
全一矩阵 | m16f = cv::Matx16f::ones(); |
创建一个单位矩阵 | m33f = cv::Matx33f::eye(); |
创建一个可以容纳另一 个矩阵对角线的矩阵 |
m31f = cv::Matx33f::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; |
单例代数 | m * a; a * m; m / a; |
比较 | m1 == m2; m1 != m2; |
点积 | m1.dot(m2); |
点积 | m2.ddot(m2);//双精度类型的 |
改变矩阵形状 | m91f = m33f.reshape<9.1>(); |
交换操作符 | m44f = (Matx44f) m44d |
提取(i,j)处的2*2子矩阵 | m44f.get_mirror<2,2>(i,j); |
提取第i行 | m14f = m44f.row(i); |
提取第i列 | 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); |
cv::Veb<>类继承于cv:Matx<>,其别名为cv::Vec{2,3,4,6}{b,w,s,i,f,d},如cv::Vec2i,cv::Vec3b等
其中b = unsigned char,w = unsigned short, s = short,i = int,f = float,d = double。
以上两种类的访问方式通过下标访问,[]和()都可以。
操作 | 示例 |
默认构造函数 | 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);//只有三维点可以 |
Point并不是继承固定向量类,而不是由自己的模板派生的,但可以从固定向量类转换得到。其访问方式也放生改变
如mypoint.x,mypoint.y等(mypoint是Point类的一个对象)。cv::Point类也有别名,如cv::Point2i,cv::Point2f,cv::Point2d,cv::Point3i等。
操作 | 示例 |
默认构造函数 | 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.dot(p2); |
叉乘 | p1.cross(p2);//只有三维点可以 |
判断一个点p是否在举行r内 | p.inside(r);//只有二维点可以 |
这些类型可以与C接口类型CvPoint和CvPoint2D32f互相转换。
其本质是一个四维Point类,一般是双精度四元素向量的别名,访问方式与Vec相同。直接继承于cv::Vec
操作 | 示例 |
默认构造函数 | cv::Scalar s; |
复制构造函数 | cv::Scalar s2(s1); |
值构造函数 | cv::Scalar s(x0); cv::Scalar s(x0,x1,x2,x3); |
元素相乘 | s1.mul(s2); |
四元数共轭 | s.conj(); |
四元数真值测试 | s.isReal(); |
cv::Scalar类可以与旧式C语言接口CvScalar自由地互换。
Size类与Point类相似,但Size的属性是width和height,而不是x,y。其实Size类是Size2i的别名,如果宽度和高度是浮点数,则用cv::Size2f。Size类可以与Point类互换。
操作 | 示例 |
默认构造函数 | cv::Size sz; cv::Size2i sz; cv::Size2f sz; |
复制构造函数 | cv::Size sz2(sz1); |
值构造函数 | cv::Size2f sz(w, h); |
成员访问 | sz.width; sz.height; |
计算面积 | sz.area(); |
cv::Rect拥有width,height,x,y四个属性。如果是非轴对称的矩形,可以使用cv::RotateRect类,它拥有一个cv::Point2f类型的中心点,一个cv::Size2f类型的size,还有一个额外的浮点类型的角度。
cv::Rect类并不是从Point,Size类继承过来的,所有并没有继承操作。
Rect类操作:
操作 | 示例 |
默认构造函数 | cv::Rect r; |
复制构造函数 | cv::Rect r2(r1); |
值构造函数 | cv::Rect(x,y,width,height) |
由起始点和大小构造 | 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); |
cv::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) |
比较r1和r2是否不相等 | bool ne = (r1 != r2) |
cv::RotatedRect类
操作 | 示例 |
默认构造函数 | cv::RotateRect rr(); |
复制构造函数 | cv::RotateRect rr2(rr1); |
从两个点构造 | cv::RotateRect(p1, p1); |
值构造函数 | cv::RotateRect rr(p, sz, theta); |
成员访问 | rr.center; rr.size; rr.angle; |
返回四个角的列表 | rr.points(pts[4]); |