【opencv13】cv::Matx固定矩阵类/cv::Vec固定向量类

1.固定矩阵类

固定矩阵类要在编译之前知道其维度,因此叫做“固定”。因此,这些数据都是保存在栈中,且清理也相当快,有专门为小型优化实现矩阵(2×2,3×3,等等)。在OpenCV的c++接口中,固定矩阵类也是许多其他基本类型的核心。固定向量类派生自固定矩阵类,其他类要么派生自固定向量类(如cv::Scalar),要么在许多重要操作中依赖于转换到固定向量类。像往常一样,固定矩阵类实际上是一个模板。该模板被称为cv::Matx<>,但是单个矩阵通常通过别名分配,别名的组合方式有。
一般来说,当你用固定矩阵类表示一个矩阵时你要用它来做矩阵代数。如果你的对象真的是一个大数据数组,比如一个图像或者一个庞大的点列表,固定的矩阵类不是正确的解决方案;(这种情况应该用cv::Mat,在之后讨论)。

操作 例子
默认构造函数 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 );
初始化对应维度的零矩阵 m23d = cv::Matx23d::zeros();
初始化对应维度的一矩阵 m16f = cv::Matx16f::ones();
创建对应维度的单位矩阵 m33f = cv::Matx33f::eye();
创建一个均匀分布的矩阵 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 );//各个元素相乘并相加
矩阵各对应位置乘积 m1.ddot( m2 );//各个元素相乘并相加,双精度
reshape矩阵 m91f = m33f.reshape<9,1>();
强制转换矩阵类型 m44f = (Matx44f) 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
每个元素相乘(不求和) m1.mul( m2 );

Note:许多固定矩阵类函数相对于类是静态的。

如:利用语句cv::Mat33f::eye(),创建3 × 3单位矩阵。在该例子中,由于eye()是类Mat33f的成员,因此不需要传入参数。

2.固定向量类

固定向量类是从固定矩阵类派生出来的,cv::Vec<>实际上只是cv::Matx<>在只有一列时的一种特殊的矩阵。cv::Vec<>的别名有。

操作 例子
默认构造函数 Vec2s v2s; Vec6f v6f; // etc...
拷贝构造函数 Vec3f u3f( v3f );
带值的构造函数 Vec2f v2f(x0,x1); Vec6d v6d(x0,x1,x2,x3,x4,x5);
访问数据成员 v4f[ i ]; v3w( j );//利用[]和()都可行
向量叉乘 v3f.cross( u3f );

固定向量类的主要便利之处是能够访问具有单个序号的元素,以及一些对于一般矩阵没有意义的特定附加函数(例如,叉乘)。

0.给自己打个小广告

本人211硕士毕业,目前从事深度学习,机器学习计算机视觉算法行业,目前正在将我的各类学习笔记发布在我的公众号中,希望感兴趣一起学习的同学们可以关注下~~~
本人微信公众号:yuanCruise


【opencv13】cv::Matx固定矩阵类/cv::Vec固定向量类_第1张图片

你可能感兴趣的:(【opencv13】cv::Matx固定矩阵类/cv::Vec固定向量类)