Opencv学习----基本结构对象-cv::Mat-成员和接口

(1)成员

int flags;

包括几位域:signature(签名)、continuity(连续性)、depth(深度)、channels(通道数)。构造函数中默认赋值为MAGIC_VAL。

int dims;

矩阵维数>=2

int rows, cols;

当维数>=2时,表示行数和列数

uchar* data;

指向数据的指针

const uchar* datastart;

在locateROI和adjustROI中使用的助手字段

const uchar* dataend;

在locateROI和adjustROI中使用的助手字段

const uchar* datalimit;

在locateROI和adjustROI中使用的助手字段

MatAllocator* allocator;

自定义分配器

UMatData* u;

转换为UmatData的指针

 

 

(2)接口

Mat(int rows, int cols, int type)

根据行数、列数、通道深度类型创建,

type:使用CV_8UC1,…, CV_64FC4创建1-4通道矩阵,或CV_8UC (n),……, CV_64FC(n)创建多通道(最多CV_CN_MAX通道)矩阵。

Mat(Size size, int type)

同上

Mat(int rows, int cols, int type, const Scalar& s)

s:将所有矩阵元素设置为s值

Mat(Size size, int type, const Scalar& s)

同上

Mat(int ndims, const int* sizes, int type)

ndims:数组维数;sizes:为整数元素的集合

Mat(const std::vector<int>& sizes, int type)

sizes:为整数元素的集合

Mat(int ndims, const int* sizes, int type, const Scalar& s)

sizes:为整数元素的集合,将元素用s赋值。

Mat(const std::vector<int>& sizes, int type, const Scalar& s)

同上

Mat(const Mat& m)

 

Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

data:针指向用户数据的指针。接受没有分配矩阵数据的data指针和step。只是初始化指向指定数据的矩阵头,不复制任何数据。该函数可以用于处理外部数据。外部数据不会自动释放,所以需要自己处理释放。

Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

同上

Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)

同上

Mat(const std::vector<int>& sizes, int type, void* data, const size_t* steps=0)

同上

Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all())

m:m数组(作为一个整体或部分)分配给构造的矩阵。这些构造函数不会复制任何数据。而是,指向m数据或其子数组的头被构造并与之关联。引用计数器(如果有的话)是递增的。因此,当您使用这样的构造函数修改形成的矩阵时,您也修改m的相应元素。如果您想拥有子数组的独立副本,请使用Mat::clone()。

rowRange:行范围

colRange:列范围。Range::all()表示所有列。

Mat(const Mat& m, const Rect& roi)

roi:截取的矩形大小范围

Mat(const Mat& m, const Range* ranges)

ranges:每个维数上m选定的范围数组。

Mat(const Mat& m, const std::vector<Range>& ranges)

同上

Mat& operator = (const Mat& m)

赋值运算符。不复制任何数据,而是共享数据,并且引用计数器(如果有的话)递增。在分配新数据之前,旧数据通过Mat::release被取消引用。

UMat getUMat(AccessFlag accessFlags, UMatUsageFlags usageFlags = USAGE_DEFAULT) const

根据mat得到Umat

Mat row(int y) const

为矩阵行设置一个新的头。

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

Mat col(int x) const

为矩阵列设置一个新的头

Mat rowRange(int startrow, int endrow) const

为起始行和终止行范围的行赋予新的头。

Mat rowRange(const Range& r) const

同上

Mat colRange(int startcol, int endcol) const

为起始列和终止列范围的行赋予新的头。

Mat colRange(const Range& r) const

同上

Mat diag(int d=0) const

为指定的矩阵对角线赋予新头。新的矩阵为单列矩阵。

Mat m = (Mat_<int>(3,3) <<

1,2,3,

4,5,6,

7,8,9);

Mat d0 = m.diag(0)= {

[1]

[5]

[9]}

static Mat diag(const Mat& d)

同上

Mat clone() const CV_NODISCARD

创建数组和底层数据的完整副本。

void copyTo( OutputArray m ) const

该方法将矩阵数据复制到另一个矩阵

void copyTo( OutputArray m, InputArray mask ) const

mask:为CV_8U类型。

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

将源像素值转换为目标数据类型。

rtype: 期望的输出矩阵类型。更确切地说是与输入矩阵的深度和通道相同的类型

m(x,y)=saturate_cast<rType>(alpha(*this)(x,y) + beta)

Mat& setTo(InputArray value, InputArray mask=noArray())

将所有或部分数组元素设置为指定值。

Mat reshape(int cn, int rows=0) const

在不复制数据的情况下更改二维矩阵的形状和/或通道数。

cn:新的通道数。rows:新的函数

Mat reshape(int cn, int newndims, const int* newsz) const

同上

Mat reshape(int cn, const std::vector<int>& newshape) const

同上

MatExpr t() const

转置一个矩阵。

利用矩阵表达式进行矩阵置换。它不执行实际换位,但返回一个临时矩阵换位对象,可以进一步用作部分较复杂的矩阵表达式或可赋给一个矩阵:

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

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

MatExpr inv(int method=DECOMP_LU) const

逆矩阵。

MatExpr mul(InputArray m, double scale=1) const

执行两个矩阵的元素乘或除法。

Mat C = A.mul(5/B); // 想当于(A, B, C, 5)

Mat cross(InputArray m) const

计算两个3元向量的叉乘。

 

double dot(InputArray m) const

计算两个向量的点积。

static MatExpr zeros(int rows, int cols, int type)

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

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

static MatExpr zeros(Size size, int type)

同上

static MatExpr zeros(int ndims, const int* sz, int type)

同上

static MatExpr ones(int rows, int cols, int type)

返回数组元素都为1的Mat.

Mat A = Mat::ones(100, 100, CV_8U)*3;

static MatExpr ones(Size size, int type)

同上

static MatExpr ones(int ndims, const int* sz, int type)

同上

static MatExpr eye(int rows, int cols, int type)

返回指定大小和类型的单位矩阵。

Mat A = Mat::eye(4, 4, CV_32F)*0.1;

static MatExpr eye(Size size, int type)

 

void create(int rows, int cols, int type)

根据需要分类新的数据数组。

Opencv的大多数需要new数组的方法都会调用该方法。

其算法如下:

(1) 如果当前数组形状和类型与新数组形状匹配,则立即返回。否则,通过调用Mat::release取消对前面数据的引用。

(2)初始化新头。

(3) 分配total() 、elemSize()字节的新数据。

(4) 分配与数据、引用计数器相关联的新计数器,并将其设置为1。

void create(Size size, int type)

同上

void create(int ndims, const int* sizes, int type)

同上

void create(const std::vector<int>& sizes, int type)

同上

void addref()

递增引用计数器。通常,为了避免内存泄漏,不应该显式地调用该方法。它由矩阵赋值运算符隐式调用。

void release()

递减引用计数器并在需要时释放矩阵。

同上,不建议手动调用。

void reserve(size_t sz)

为一定数量的行预留空间。

void reserveBuffer(size_t sz)

预留一定数量的字节空间

void resize(size_t sz)

改变矩阵行数。

void resize(size_t sz, const Scalar& s)

同上

void locateROI( Size& wholeSize, Point& ofs ) const

在使用Mat::row、Mat::col、Mat::rowRange、Mat::colRange等从矩阵中提取子矩阵之后,生成的子矩阵只指向原始大矩阵的一部分。但是,每个子矩阵都包含信息(由datastart和dataend字段表示),这些信息有助于重建原始矩阵的大小和提取的子矩阵在原始矩阵中的位置

Mat& adjustROI( int dtop, int dbottom, int dleft, int dright )

该方法是补充Mat::locateROI。这些函数的典型用法是确定子矩阵在父矩阵中的位置,然后以某种方式移动位置。通常,当需要考虑ROI之外的像素时,过滤操作可能需要它。当所有方法参数均为正值时,ROI需要在各个方向以指定的量增长

Mat operator()( Range rowRange, Range colRange )

提取一个矩形子矩阵。

Mat operator()( const Rect& roi ) const

同上。

Mat operator()( const Range* ranges ) const

同上。

bool isContinuous() const

矩阵是否连续。

如果矩阵元素连续存储,且每行末尾没有空格,则该方法返回true。否则,返回false。显然,1x1或1xN矩阵总是连续的。使用Mat::create创建的矩阵总是连续的。但是,如果您使用Mat::col、Mat::diag等提取矩阵的一部分,或者为外部分配的数据构造一个矩阵头,这些矩阵可能不再具有此属性。

bool isSubmatrix() const

如果矩阵是另一个矩阵的子矩阵,则返回true

size_t elemSize() const

返回矩阵的字节大小。

size_t elemSize1() const

返回矩阵每个通道的字节大小

int type() const

返回矩阵元素的类型。如:CV_16SC3 

int depth() const

返回矩阵元素深度。例如,对于一个16位带符号的元素数组,该方法返回CV_16S

int channels() const

返回矩阵通道的数目

size_t step1(int i=0) const

返回一个除以Mat::elemSize1()矩阵步长。快速访问任意矩阵元素是很有用的。

bool empty() const

如果Mat::total()为0或Mat::data为空,则该方法返回true

size_t total() const

该方法返回数组元素的数量(如果数组表示图像,则返回像素的数量)。

size_t total(int startDim, int endDim=INT_MAX) const

 

uchar* ptr(int i0=0)

返回指向指定矩阵行的指针。

uchar* ptr(int row, int col)

返回指向指定矩阵行、列的指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dylan55_you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值