Mat-获取指定行列数据

本文介绍了如何在Mat对象中利用特定接口获取行或列的数据,包括获取单一行、单一列以及连续行和列的方法,详细解析了相关接口函数的使用。
部署运行你感兴趣的模型镜像

     在我们使用Mat类型的对象的时候,有时会想直接获取比如第一行的数据、最后一列的数据等等。Mat数据结构提供了这样的接口给我们使用,接口列表如下:

 //! returns a new matrix header for the specified row
    [1]Mat row(int y) const;
    //! returns a new matrix header for the specified column
    [2]Mat col(int x) const;
    //! ... for the specified row span
    [3]Mat rowRange(int startrow, int endrow) const;
    [4]Mat rowRange(const Range& r) const;
    //! ... for the specified column span
    [5]Mat colRange(int startcol, int endcol) const;
    [6]Mat colRange(const Range& r) const;

    [1][2]是获取指定某一行或者某一列的数据的接口函数,而[3]-[6]则是获取某连续几行或者几列数据的接口函数。[1]和[2]的定义如下:

inline Mat Mat::row(int y) const { return Mat(*this, Range(y, y+1), Range::all()); }
inline Mat Mat::col(int x) const { return Mat(*this, Range::all(), Range(x, x+1)); }

    可以看到,[1][2]都使用了Mat的一个构造函数,这在构造函数那篇博客中没有讲到。这个构造函数的定义如下:

Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) : size(&rows)
{
    initEmpty();
    CV_Assert( m.dims >= 2 );
    if( m.dims > 2 )
    {
        AutoBuffer<Range> rs(m.dims);
        rs[0] = _rowRange;
        rs[1] = _colRange;
        for( int i = 2; i < m.dims; i++ )
            rs[i] = Range::all();
        *this = m(rs);
        return;
    }

    *this = m;
    if( _rowRange != Range::all() && _rowRange != Range(0,rows) )
    {
        CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows );
        rows = _rowRange.size();
        data += step*_rowRange.start;
        flags |= SUBMATRIX_FLAG;
    }

    if( _colRange != Range::all() && _colRange != Range(0,cols) )
    {
        CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols );
        cols = _colRange.size();
        data += _colRange.start*elemSize();
        flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1;
        flags |= SUBMATRIX_FLAG;
    }

    if( rows == 1 )
        flags |= CONTINUOUS_FLAG;

    if( rows <= 0 || cols <= 0 )
    {
        release();
        rows = cols = 0;
    }
}

    而[3][4][5][6]都同样调用了这个构造函数:

inline Mat Mat::rowRange(int startrow, int endrow) const
    { return Mat(*this, Range(startrow, endrow), Range::all()); }
inline Mat Mat::rowRange(const Range& r) const
    { return Mat(*this, r, Range::all()); }
inline Mat Mat::colRange(int startcol, int endcol) const
    { return Mat(*this, Range::all(), Range(startcol, endcol)); }
inline Mat Mat::colRange(const Range& r) const
    { return Mat(*this, Range::all(), r); }

您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值