Opencv数据类型(三):Matx类和Vec类
文章目录
- 1、cv::Matx支持的操作
- 2、cv::Matx类模板
- 3、众多别名
- 4、举例
- 5、固定向量类 cv::Vec
cv::Matx类又称固定矩阵类,需要是维度已知,因为所有数据都是在堆栈上分配的,所以分配和清除都很快,而且在小型矩阵(2 2,33等)做过特别优化。cv::Matx类是opencv_c++基本类型的核心,固定向量类继承固定矩阵类。
一般情况下,当你要来处理矩阵代数的矩阵的时候,需要用到固定矩阵类;如果对象是一个图像或者大型浮点的大数组,那么推荐用cv::Mat类
cv::Vec 类又称固定向量类,可以说,固定向量类模板cv::Vec 是列为1的 cv::Matx<>.
1、cv::Matx支持的操作
摘自 https://blog.csdn.net/qiu931110/article/details/85195287
来自《学习OpenCV3》


2、cv::Matx类模板
template<typename _Tp, int m, int n> class Matx
{
public:enum {rows = m,cols = n,channels = rows*cols,
#ifdef OPENCV_TRAITS_ENABLE_DEPRECATEDdepth = traits::Type<_Tp>::value,type = CV_MAKETYPE(depth, channels),
#endifshortdim = (m < n ? m : n)};typedef _Tp value_type;typedef Matx<_Tp, m, n> mat_type;typedef Matx<_Tp, shortdim, 1> diag_type;//! default constructorMatx();Matx(_Tp v0); //!< 1x1 matrixMatx(_Tp v0, _Tp v1); //!< 1x2 or 2x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2); //!< 1x3 or 3x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3); //!< 1x4, 2x2 or 4x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4); //!< 1x5 or 5x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5); //!< 1x6, 2x3, 3x2 or 6x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6); //!< 1x7 or 7x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7); //!< 1x8, 2x4, 4x2 or 8x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8); //!< 1x9, 3x3 or 9x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9); //!< 1x10, 2x5 or 5x2 or 10x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3,_Tp v4, _Tp v5, _Tp v6, _Tp v7,_Tp v8, _Tp v9, _Tp v10, _Tp v11); //!< 1x12, 2x6, 3x4, 4x3, 6x2 or 12x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3,_Tp v4, _Tp v5, _Tp v6, _Tp v7,_Tp v8, _Tp v9, _Tp v10, _Tp v11,_Tp v12, _Tp v13); //!< 1x14, 2x7, 7x2 or 14x1 matrixMatx(_Tp v0, _Tp v1, _Tp v2, _Tp v3,_Tp v4, _Tp v5, _Tp v6, _Tp v7,_Tp v8, _Tp v9, _Tp v10, _Tp v11,_Tp v12, _Tp v13, _Tp v14, _Tp v15); //!< 1x16, 4x4 or 16x1 matrixexplicit Matx(const _Tp* vals); //!< initialize from a plain array#ifdef CV_CXX11Matx(std::initializer_list<_Tp>); //!< initialize from an initializer list
#endifstatic Matx all(_Tp alpha);static Matx zeros();static Matx ones();static Matx eye();static Matx diag(const diag_type& d);static Matx randu(_Tp a, _Tp b);static Matx randn(_Tp a, _Tp b);//! dot product computed with the default precision_Tp dot(const Matx<_Tp, m, n>& v) const;//! dot product computed in double-precision arithmeticsdouble ddot(const Matx<_Tp, m, n>& v) const;//! conversion to another data typetemplate<typename T2> operator Matx<T2, m, n>() const;//! change the matrix shapetemplate<int m1, int n1> Matx<_Tp, m1, n1> reshape() const;//! extract part of the matrixtemplate<int m1, int n1> Matx<_Tp, m1, n1> get_minor(int i, int j) const;//! extract the matrix rowMatx<_Tp, 1, n> row(int i) const;//! extract the matrix columnMatx<_Tp, m, 1> col(int i) const;//! extract the matrix diagonaldiag_type diag() const;//! transpose the matrixMatx<_Tp, n, m> t() const;//! invert the matrixMatx<_Tp, n, m> inv(int method=DECOMP_LU, bool *p_is_ok = NULL) const;//! solve linear systemtemplate<int l> Matx<_Tp, n, l> solve(const Matx<_Tp, m, l>& rhs, int flags=DECOMP_LU) const;Vec<_Tp, n> solve(const Vec<_Tp, m>& rhs, int method) const;//! multiply two matrices element-wiseMatx<_Tp, m, n> mul(const Matx<_Tp, m, n>& a) const;//! divide two matrices element-wiseMatx<_Tp, m, n> div(const Matx<_Tp, m, n>& a) const;//! element accessconst _Tp& operator ()(int i, int j) const;_Tp& operator ()(int i, int j);//! 1D element accessconst _Tp& operator ()(int i) const;_Tp& operator ()(int i);Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_AddOp);Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_SubOp);template<typename _T2> Matx(const Matx<_Tp, m, n>& a, _T2 alpha, Matx_ScaleOp);Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_MulOp);Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_DivOp);template<int l> Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp);Matx(const Matx<_Tp, n, m>& a, Matx_TOp);_Tp val[m*n]; //< matrix elements
};
3、众多别名
没有看到int型的初始化?
typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
typedef Matx<float, 1, 3> Matx13f;
typedef Matx<double, 1, 3> Matx13d;
typedef Matx<float, 1, 4> Matx14f;
typedef Matx<double, 1, 4> Matx14d;
typedef Matx<float, 1, 6> Matx16f;
typedef Matx<double, 1, 6> Matx16d;typedef Matx<float, 2, 1> Matx21f;
typedef Matx<double, 2, 1> Matx21d;
typedef Matx<float, 3, 1> Matx31f;
typedef Matx<double, 3, 1> Matx31d;
typedef Matx<float, 4, 1> Matx41f;
typedef Matx<double, 4, 1> Matx41d;
typedef Matx<float, 6, 1> Matx61f;
typedef Matx<double, 6, 1> Matx61d;typedef Matx<float, 2, 2> Matx22f;
typedef Matx<double, 2, 2> Matx22d;
typedef Matx<float, 2, 3> Matx23f;
typedef Matx<double, 2, 3> Matx23d;
typedef Matx<float, 3, 2> Matx32f;
typedef Matx<double, 3, 2> Matx32d;typedef Matx<float, 3, 3> Matx33f;
typedef Matx<double, 3, 3> Matx33d;typedef Matx<float, 3, 4> Matx34f;
typedef Matx<double, 3, 4> Matx34d;
typedef Matx<float, 4, 3> Matx43f;
typedef Matx<double, 4, 3> Matx43d;typedef Matx<float, 4, 4> Matx44f;
typedef Matx<double, 4, 4> Matx44d;
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d;
4、举例
1)初始化一个Matx
先看一个简单的构造函数
template<typename _Tp, int m, int n> inline
Matx<_Tp, m, n>::Matx()
{for(int i = 0; i < channels; i++) val[i] = _Tp(0);
}
注意, cv::Matx
int main() {cv::Matx <float,3,2> Matx55f = {1.1, 2.3, 3.1, 4.5, 5.2, 6.4};std::cout << Matx55f(1,1)<< std::endl; //cout 4.5std::cout << Matx55f(2,1) << std::endl; //cout 6.4std::cout << "hello world" << std::endl;return 0;
}
2)初始化一个3*3的全1矩阵
int main() {cv::Matx33f M33 = cv::Matx33f::ones();std::cout << M33(1,1)<< std::endl; //cout 1std::cout << M33(2,1) << std::endl; //cout 1std::cout << "hello world" << std::endl;return 0;
}
5、固定向量类 cv::Vec
固定向量类是列为1的cv::Matc<>,别称有 cv::Vec{2,3,4,6}{b,s,w,I,f,d}
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
