zoukankan      html  css  js  c++  java
  • Mat类具体解释(二)

    Mat::~Mat

    Mat的析构函数。

    C++: Mat::~Mat()

    析构函数调用Mat::release()。

    Mat::operator =

    提供矩阵赋值操作。

    C++: Mat& Mat::operator=(const Mat& m)

    C++: Mat& Mat::operator=(const MatExpr_Base& expr)

    C++: Mat& Mat::operator=(const Scalar& s)

    參数:

    m – 被赋值的右側的矩阵。 矩阵的赋值是一个复杂度为O(1) 的操作。 这就意味着没有数据段复制而且有数量的递增两矩阵将使用同一引用计数器。

    在给矩阵赋新数据之前先由Mat::release()释放引用。

    expr –被赋值的矩阵表达式对象。 作为第一种赋值方式的逆操作另外一种形式能够被又一次用到具有适当大小和尺寸的已分配空间的矩阵上以适应表达式的结果。矩阵表达式扩展得到的实函数将自己主动处理这个分配过程。

    比如:

    C=A+B 扩展成add(A, B, C) , andadd() 要当心C又一次分配数据的操作。

    .

    s – 标量赋值给每个矩阵元,矩阵的大小和类型将不会改变。有现成的赋值运算符。因为他们各不同样请阅读运算符參数说明。

    Mat::operator MatExpr

    提供一种Mat-to-MatExpr转换运算符

    C++: Mat::operator MatExpr_<Mat, Mat>() const

    转换运算符不能显示调用而是由矩阵表达式引擎(Matrix Expression engine)内部调用The cast operator should not be called explicitly. It is used internally by the Matrix Expressions engine.

    Mat::row

    创建一个指定行数的矩阵头。.

    C++: Mat Mat::row(int i) const

    參数:

    i – 一个0基的行索引.

    该方法创建一个具有指定了行数的新矩阵头的矩阵并返回它。

    这是一个复杂度为O(1) 的操作。无须考虑矩阵的尺寸。新矩阵和原矩阵共享一份基础数据。这是一个典型基本矩阵处理操作的样例, axpy是LU和很多其他算法都使用的一个函数

    inline void matrix_axpy(Mat& A, int i, int j, double alpha)

    {

    A.row(i) += A.row(j)*alpha;

    }

    Note:在当前实现中。以下的代码不会无法按预期的效果工作:

    Mat A ;

    ...

    A.row(i) = A.row(j) ;/ /不起作用

    发生这样的情况是由于 A.row(i) 形成暂时矩阵头进一步分配给还有一个矩阵头。请记住,每一个操作复杂度为O(1),即没有复制不论什么数据。

    因此,假设你预期第 j行被拷贝到第 i行,那么上述赋值不成立。要做到这一点。应该把这样的简单的赋值转换到表达式中或使用 Mat::copyTo() 方法:

    Mat A ;

    ...

    / / 可行,但看上去有点目的不明白。

    A.row(i) = A.row(j) + 0;

    / / 这是有点儿长。但这是推荐的方法。

    A.row(j).copyTo(A.row(i)) ;

    Mat::col

    创建一个具有指定了矩阵头中列数这个參数的矩阵

    C++: Mat Mat::col(int j) const

    參数:

    j –一个0基(从0開始)的列索引

    该方法创建一个具有指定了矩阵头中列数这个參数的新矩阵并作为函数返回值。

    这是一种复杂度为O(1)的操作,不用考虑矩阵的尺寸大小。新矩阵和原始矩阵共享一份基础数据。參看Mat::row()说明信息。

    Mat::rowRange

    为指定的行span创建一个新的矩阵头。

    C++: Mat Mat::rowRange(int startrow, int endrow) const

    C++: Mat Mat::rowRange(const Range& r) const

    參数:

    startrow – 一个包容性的0基(从0開始)的行span起始索引.。

    endrow – 一个0基的独占性的行span.终止索引。

    r – Range 结构包括着起始和终止的索引值。该方法给矩阵指定的行span创建了新的头。 与Mat::row() 和 Mat::col()相类似这是一个复杂度为O(1)的操作。

    Mat::colRange

    为指定的行span创建一个矩阵头。

    C++: Mat Mat::colRange(int startcol, int endcol) const

    C++: Mat Mat::colRange(const Range& r) const

    參数:

    startcol – 一个包容性的0基(从0開始)的span列起始索引。

    endcol –一个0基的独占性的列span.终止索引。

    r –Range 结构包括着起始和终止的索引值。该方法给矩阵指定的列span创建了新的头。

    与Mat::row() 和 Mat::col()相类似这是一个复杂度为O(1)的操作。

    Mat::diag

    提取或创建矩阵对角线。

    C++: Mat Mat::diag(int d) const

    C++: static Mat Mat::diag(const Mat& matD)

    參数:

    d – 对角线的索引值,能够是下面的值:

    – d=0 是主对角线

    – d>0表示下半部的对角线。

    比如:d=1对角线是紧挨着住对角线并位于矩阵下方。

    – d<0表示来自矩阵上半部的对角线。比如:d= 1表示对角线被设置在对角线的上方并紧挨着。

    matD – 单列用于形成矩阵对角线的列。

    该方法为指定的矩阵创建一个新的头。

    然后新矩阵被切割为单独的列矩阵。

    类似于Mat::row() 和Mat::col() ,它是复杂度为O(1)操作。

    Mat::clone

    创建一个数组及其基础数据的完整副本。

    C++: Mat Mat::clone() const

    该方法创建了一个完整的数组副本。原始的step[]不会被考虑在内的。因此数组的副本是一占用total()*elemSize()字节的连续阵列。

    Mat::copyTo

    把矩阵拷贝到还有一个矩阵中。

    C++: void Mat::copyTo(OutputArray m) const

    C++: void Mat::copyTo(OutputArray m, InputArray mask) const

    參数:

    m – 目标矩阵。

    假设它的尺寸和类型不对,在操作之前会又一次分配。

    mask – 操作掩码。它的非零元素表示矩阵中某个要被复制。

    该方法把矩阵的拷贝到还有一个新的矩阵中在复制之前该方法会调用

    m.create(this->size(), this->type);

    因此,目标矩阵会在必要的情况下又一次分配

    虽然m.copyTo(m) works flawlessly,该函数并不处理源矩阵和目标矩阵之间有重叠的部分的情况。

    当操作掩码指定以及上述的Mat::create又一次分配矩阵,新分配的矩阵在数据拷贝到里面之前全都被初始化为0。

    Mat::convertTo

    在缩放或不缩放的情况下转换为还有一种数据类型。

    C++:

    void Mat::convertTo(OutputArray m,int rtype,double alpha=1,double beta=0)const

    參数:

    m – 目标矩阵。假设它的尺寸和类型不对,在操作之前会又一次分配。

    rtype – 要求是目标矩阵的类型,或者在当前通道数与源矩阵通道数同样的情况下的depth。

    假设rtype 为负。目标矩阵与源矩阵类型同样。

    beta – 可选的delta加到缩放值中去。

    该方法将源像素值转化为目标类型saturate_cast<> 要放在最后以避免溢出

    m( x;y) = saturate_cast < rType > ( α*( *this)( x;y) +β)

    Mat::assignTo

    提供了一个convertTo的功能形式。

    C++: void Mat::assignTo(Mat& m, int type=-1 ) const

    Parameters

    m – 目标阵列。

    type – 要求是目标阵列depth或-1(假设阵列的类型和源矩阵类型同样)

    这是一个 internally 使用的由 Matrix Expressions引擎调用的方法。

    Mat::setTo

    将阵列中全部的或部分的元素设置为指定的值。

    C++: Mat& Mat::setTo(const Scalar& s, InputArray mask=noArray())

    參数:

    s – 把标量赋给阵列并转化到阵列的实际类型。

    mask – 与 *this尺寸同样的操作掩码。这是Mat::operator=(const Scalar& s)运算符的一个高级变量。

    Mat::reshape

    在无需复制数据的前提下改变2D矩阵的形状和通道数或当中之中的一个。

    C++: Mat Mat::reshape(int cn, int rows=0) const

    參数:

    cn – 新的通道数。若cn=0,那么通道数就保持不变。

    rows –新的行数。 若rows = 0, 那么行数保持不变。

    该方法为*this元素创建新的矩阵头。这新的矩阵头尺寸和通道数或当中之中的一个发生改变,在下面的情况随意组合都是有可能的:

    ü  新的矩阵没有新增或降低元素。通常。rows*cols*channels()在转换过程中保持一致。.

    ü  无数据的复制。也就是说。这是一个复杂度为 O(1)的操作。通常,假设该操作改变行数或透过其它方式改变元素行索引,那么矩阵必然是连续的。參见Mat::isContinuous()。

    比如,有一存储了STL向量的三维点集。你想用3xN的矩阵来完毕以下的操作:

    std::vector<Point3f> vec;

    ...

    Mat pointMat = Mat(vec). //把向量转化成Mat, 复杂度为O(1)的运算

    reshape(1). // 从Nx1的3通道矩阵得出Nx3 的单通道矩阵

    //相同是复杂度为O(1)的运算

    t(); // 最后转置Nx3 的矩阵

    //这个过程要复制全部的元素

    Mat::t

    转置矩阵。.

    C++: MatExpr Mat::t() const

    该方法通过矩阵表达式(matrix expression)实现矩阵的转置The method performs matrix transposition by means of matrix expressions. 它并未真正完毕了转置但却返回一个暂时的能够进一步用在更复杂的矩阵表达式中或赋给一个矩阵的转置矩阵对象:

    Mat A1 = A + Mat::eye(A.size(), A.type)*lambda;

    Mat C = A1.t()*A1; //计算(A + lambda*I)^t * (A + lamda*I).

    Mat::inv

    反转矩阵

    C++: MatExpr Mat::inv(int method=DECOMP_LU) const

    參数:

    method – 反转矩阵的方法。有下面几种可能的值:

    – DECOMP_LU是 LU 分解一定不能是单数的。

    – DECOMP_CHOLESKY 是 Cholesky LLT仅仅适用于对称正矩阵的分解。

    该类型在处理大的矩阵时的速度是LU的两倍左右。

    – DECOMP_SVD是 SVD 分解。

    假设矩阵是单数或甚至不是2维。函数就会计算伪反转矩阵。

    该方法运行矩阵的反转矩阵表达。

    这意味着该方法返回一个暂时矩阵反转对象并可进一步用于更复杂的矩阵表达式的中或分配给一个矩阵。

    Mat::mul

    运行两个矩阵按元素相乘或这两个矩阵的除法。

    C++: MatExpr Mat::mul(InputArray m, double scale=1) const

    參数:

    m – 与*this具有同样类型和大小的矩阵,或矩阵表达式。

    scale – 可选缩放系数。

    该方法返回一个用可选的缩放比率编码了每一个元素的数组乘法的暂时的对象。 注意:这不是一个相应“*”运算符的简单的矩阵乘法。

    .

    例::

    Mat C = A.mul(5/B); // 等价于divide(A, B, C, 5)

    Mat::cross

    计算3元素向量的一个叉乘积。

    C++: Mat Mat::cross(InputArray m) const

    參数:

    –还有一个叉乘操作对象。

    该方法计算了两个3元素向量的叉乘的积被操作向量必须是3元素浮点型的具有同样形状和尺寸的向量。结果也是一语被操作对象的具有同样形状和大小的浮点型3元素向量。

    Mat::dot

    计算两向量的点乘。

    C++: double Mat::dot(InputArray m) const

    參数:

    –还有一个点积操作对象。

    方法计算两个矩阵的点积。假设矩阵不单列或单行的向量,用顶部究竟部从左到右扫描次序将它们视为 1 D向量。这些向量必须具有同样的大小和类型。

    假设矩阵有多个通道,从全部通道得到的点积会被加在一起。

    Mat::zeros

    返回指定的大小和类型的零数组。

    C++: static MatExpr Mat::zeros(int rows, int cols, int type)

    C++: static MatExpr Mat::zeros(Size size, int type)

    C++: static MatExpr Mat::zeros(int ndims, const int* sizes, int type)

    參数

    ndims – 数组的维数。

    rows–行数。

    cols  –列数。

    size–替代矩阵大小规格Size(cols, rows)的方法。

    sizes– 指定数组的形状的整数数组。

    type– 创建的矩阵的类型。

    该方法返回一个 Matlab 式的零数组初始值设定项。

    它能够用于高速形成一个常数数组作为函数參数。作为矩阵的表达式或矩阵初始值设定项的一部分。

    Mat A;

    A = Mat::zeros (3。3。CV_32F);

    在上面的演示样例中,仅仅要A不是 3 x 3浮点矩阵它就会被分配新的矩阵。

    否则为现有的

    矩阵 A填充零。

    Mat::ones

    返回一个指定的大小和类型的全为1的数组。

    C++: static MatExpr Mat::ones(int rows, int cols, int type)

    C++: static MatExpr Mat::ones(Size size, int type)

    C++: static MatExpr Mat::ones(int ndims, const int* sizes, int type)

    參数:

    ndims –数组的维数。

    rows –行数。.

    cols –列数。

    size –替代矩阵大小规格Size(cols, rows)的方法。

    sizes –指定数组的形状的整数数组。

    type –创建的矩阵的类型。

    该方法返回一个 Matlab 样式 1 的数组初始值设定项。类似Mat::zeros()。

    请注意,这样的方法中你能够使用随意一个值和Matlab 语法初始化数组例如以下:

    Mat A = Mat::ones (100。100,CV_8U) * 3 。/ / 使100 x 100 矩阵里充满 3。

    上述操作不会形成一个 100 x 100 1 的矩阵。然后乘以 3。相反,它仅仅是记住

    缩放因子(在本例中 3)在实际调用矩阵初始值设定项时使用它。

  • 相关阅读:
    生成验证码图片(含模糊背景)
    再论验证码安全:请及时销毁你的验证码
    C# DES 加密/解密
    jQuery 表格工具集
    见证VS2010发布会[转]
    jQuery Lightbox(balupton版)图片展示插件讲解
    Coding完美世界——VS2010发布会见闻!【转】
    asp.net对Get请求的加密
    【C#源码】DES加密解密类
    asp.net1.1和asp.net 2.0共存
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7356332.html
Copyright © 2011-2022 走看看