OpenCV 4.11.0
开源计算机视觉
|
N维密集数组类 更多…
#include <opencv2/core/mat.hpp>
公共类型 | |
枚举 | { MAGIC_VAL = 0x42FF0000 , AUTO_STEP = 0 , CONTINUOUS_FLAG = CV_MAT_CONT_FLAG , SUBMATRIX_FLAG = CV_SUBMAT_FLAG } |
枚举 | { MAGIC_MASK = 0xFFFF0000 , TYPE_MASK = 0x00000FFF , DEPTH_MASK = 7 } |
公共成员函数 | |
Mat () CV_NOEXCEPT | |
Mat (const cuda::GpuMat &m) | |
从 GpuMat 下载数据 | |
Mat (const Mat &m) | |
Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all()) | |
Mat (const Mat &m, const Range *ranges) | |
Mat (const Mat &m, const Rect &roi) | |
Mat (const Mat &m, const std::vector< Range > &ranges) | |
模板<typename _Tp > | |
Mat (const MatCommaInitializer_< _Tp > &commaInitializer) | |
模板<typename _Tp , int m, int n> | |
Mat (const Matx< _Tp, m, n > &mtx, bool copyData=true) | |
模板<typename _Tp > | |
Mat (const Point3_< _Tp > &pt, bool copyData=true) | |
模板<typename _Tp > | |
Mat (const Point_< _Tp > &pt, bool copyData=true) | |
模板<typename _Tp , size_t _Nm> | |
Mat (const std::array< _Tp, _Nm > &arr, bool copyData=false) | |
模板<typename _Tp , typename = typename std::enable_if<std::is_arithmetic<_Tp>::value>::type> | |
Mat (const std::initializer_list< _Tp > list) | |
模板<typename _Tp > | |
Mat (const std::initializer_list< int > sizes, const std::initializer_list< _Tp > list) | |
模板<typename _Tp > | |
Mat (const std::vector< _Tp > &vec, bool copyData=false) | |
Mat (const std::vector< int > &sizes, int type) | |
Mat (const std::vector< int > &sizes, int type, const Scalar &s) | |
Mat (const std::vector< int > &sizes, int type, void *data, const size_t *steps=0) | |
模板<typename _Tp , int n> | |
Mat (const Vec< _Tp, n > &vec, bool copyData=true) | |
Mat (int ndims, const int *sizes, int type) | |
Mat (int ndims, const int *sizes, int type, const Scalar &s) | |
Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0) | |
Mat (int rows, int cols, int type) | |
Mat (int rows, int cols, int type, const Scalar &s) | |
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP) | |
Mat (Mat &&m) CV_NOEXCEPT | |
Mat (Size size, int type) | |
Mat (Size size, int type, const Scalar &s) | |
Mat (Size size, int type, void *data, size_t step=AUTO_STEP) | |
~Mat () | |
析构函数 - 调用 release() | |
void | addref () |
递增引用计数器。 | |
Mat & | adjustROI (int dtop, int dbottom, int dleft, int dright) |
调整父矩阵内子矩阵的大小和位置。 | |
void | assignTo (Mat &m, int type=-1) const |
提供convertTo的函数形式。 | |
模板<typename _Tp > | |
_Tp & | at (const int *idx) |
模板<typename _Tp > | |
const _Tp & | at (const int *idx) const |
模板<typename _Tp , int n> | |
_Tp & | at (const Vec< int, n > &idx) |
模板<typename _Tp , int n> | |
const _Tp & | at (const Vec< int, n > &idx) const |
模板<typename _Tp > | |
_Tp & | at (int i0, int i1, int i2) |
模板<typename _Tp > | |
const _Tp & | at (int i0, int i1, int i2) const |
模板<typename _Tp > | |
_Tp & | at (int i0=0) |
返回对指定数组元素的引用。 | |
模板<typename _Tp > | |
const _Tp & | at (int i0=0) const |
模板<typename _Tp > | |
_Tp & | at (int row, int col) |
模板<typename _Tp > | |
const _Tp & | at (int row, int col) const |
模板<typename _Tp > | |
_Tp & | at (Point pt) |
模板<typename _Tp > | |
const _Tp & | at (Point pt) const |
模板<typename _Tp > | |
MatIterator_< _Tp > | begin () |
返回矩阵迭代器并将其设置为第一个矩阵元素。 | |
模板<typename _Tp > | |
MatConstIterator_< _Tp > | begin () const |
int | channels () const |
返回矩阵通道数。 | |
int | checkVector (int elemChannels, int depth=-1, bool requireContinuous=true) const |
CV_NODISCARD_STD Mat | clone () const |
创建数组及其底层数据的完整副本。 | |
Mat | col (int x) const |
为指定的矩阵列创建一个矩阵头。 | |
Mat | colRange (const Range &r) const |
Mat | colRange (int startcol, int endcol) const |
为指定的列范围创建一个矩阵头。 | |
void | convertTo (OutputArray m, int rtype, double alpha=1, double beta=0) const |
将数组转换为另一种数据类型,并可以选择缩放。 | |
void | copySize (const Mat &m) |
内部使用函数;正确地重新分配 _size、_step 数组 | |
void | copyTo (OutputArray m) const |
将矩阵复制到另一个矩阵。 | |
void | copyTo (OutputArray m, InputArray mask) const |
void | create (const std::vector< int > &sizes, int type) |
void | create (int ndims, const int *sizes, int type) |
void | create (int rows, int cols, int type) |
根据需要分配新的数组数据。 | |
void | create (Size size, int type) |
Mat | cross (InputArray m) const |
计算两个三元素向量的叉积。 | |
void | deallocate () |
内部使用函数,建议改用“release”方法;释放矩阵数据 | |
int | depth () const |
返回矩阵元素的深度。 | |
Mat | diag (int d=0) const |
从矩阵中提取对角线。 | |
double | dot (InputArray m) const |
计算两个向量的点积。 | |
size_t | elemSize () const |
返回矩阵元素的大小(以字节为单位)。 | |
size_t | elemSize1 () const |
返回每个矩阵元素通道的大小(以字节为单位)。 | |
bool | empty () const |
如果数组没有元素,则返回 true。 | |
模板<typename _Tp > | |
MatIterator_< _Tp > | end () |
返回矩阵迭代器并将其设置为最后一个矩阵元素之后。 | |
模板<typename _Tp > | |
MatConstIterator_< _Tp > | end () const |
template<typename _Tp , typename Functor > | |
void | forEach (const Functor &operation) |
并行运行给定的函数体遍历所有矩阵元素。 | |
template<typename _Tp , typename Functor > | |
void | forEach (const Functor &operation) const |
UMat | getUMat (AccessFlag accessFlags, UMatUsageFlags usageFlags=USAGE_DEFAULT) const |
从 Mat 中检索 UMat | |
MatExpr | inv (int method=DECOMP_LU) const |
求矩阵的逆。 | |
bool | isContinuous () const |
报告矩阵是否连续。 | |
bool | isSubmatrix () const |
如果矩阵是另一个矩阵的子矩阵,则返回 true | |
void | locateROI (Size &wholeSize, Point &ofs) const |
定位父矩阵内的矩阵头。 | |
MatExpr | mul (InputArray m, double scale=1) const |
对两个矩阵执行逐元素乘法或除法。 | |
模板<typename _Tp , int m, int n> | |
operator Matx< _Tp, m, n > () const | |
template<typename _Tp , std::size_t _Nm> | |
operator std::array< _Tp, _Nm > () const | |
模板<typename _Tp > | |
operator std::vector< _Tp > () const | |
模板<typename _Tp , int n> | |
operator Vec< _Tp, n > () const | |
Mat | operator() (const Range *ranges) const |
Mat | operator() (const Rect &roi) const |
Mat | operator() (const std::vector< Range > &ranges) const |
Mat | operator() (Range rowRange, Range colRange) const |
提取矩形子矩阵。 | |
Mat & | operator= (const Mat &m) |
赋值运算符 | |
Mat & | operator= (const MatExpr &expr) |
Mat & | operator= (const Scalar &s) |
将所有或部分数组元素设置为指定值。 | |
Mat & | operator= (Mat &&m) |
void | pop_back (size_t nelems=1) |
删除矩阵底部的元素。 | |
uchar * | ptr (const int *idx) |
模板<typename _Tp > | |
_Tp * | ptr (const int *idx) |
const uchar * | ptr (const int *idx) const |
模板<typename _Tp > | |
const _Tp * | ptr (const int *idx) const |
template<int n> | |
uchar * | ptr (const Vec< int, n > &idx) |
模板<typename _Tp , int n> | |
_Tp * | ptr (const Vec< int, n > &idx) |
template<int n> | |
const uchar * | ptr (const Vec< int, n > &idx) const |
模板<typename _Tp , int n> | |
const _Tp * | ptr (const Vec< int, n > &idx) const |
uchar * | ptr (int i0, int i1, int i2) |
模板<typename _Tp > | |
_Tp * | ptr (int i0, int i1, int i2) |
const uchar * | ptr (int i0, int i1, int i2) const |
模板<typename _Tp > | |
const _Tp * | ptr (int i0, int i1, int i2) const |
uchar * | ptr (int i0=0) |
返回指向指定矩阵行的指针。 | |
模板<typename _Tp > | |
_Tp * | ptr (int i0=0) |
const uchar * | ptr (int i0=0) const |
模板<typename _Tp > | |
const _Tp * | ptr (int i0=0) const |
uchar * | ptr (int row, int col) |
模板<typename _Tp > | |
_Tp * | ptr (int row, int col) |
const uchar * | ptr (int row, int col) const |
模板<typename _Tp > | |
const _Tp * | ptr (int row, int col) const |
模板<typename _Tp > | |
void | push_back (const _Tp &elem) |
在矩阵底部添加元素。 | |
void | push_back (const Mat &m) |
模板<typename _Tp > | |
void | push_back (const Mat_< _Tp > &elem) |
模板<typename _Tp > | |
void | push_back (const std::vector< _Tp > &elem) |
void | push_back_ (const void *elem) |
内部函数 | |
模板<typename _Tp > | |
std::reverse_iterator< MatIterator_< _Tp > > | rbegin () |
与begin()相同,但用于逆向遍历。 | |
模板<typename _Tp > | |
std::reverse_iterator< MatConstIterator_< _Tp > > | rbegin () const |
void | 释放 () |
递减引用计数器,如果需要则释放矩阵。 | |
模板<typename _Tp > | |
std::reverse_iterator< MatIterator_< _Tp > > | rend () |
与end()相同,但用于逆向遍历。 | |
模板<typename _Tp > | |
std::reverse_iterator< MatConstIterator_< _Tp > > | rend () const |
void | reserve (size_t sz) |
为特定数量的行预留空间。 | |
void | reserveBuffer (size_t sz) |
为特定数量的字节预留空间。 | |
Mat | reshape (int cn, const std::vector< int > &newshape) const |
Mat | reshape (int cn, int newndims, const int *newsz) const |
Mat | reshape (int cn, int rows=0) const |
更改二维矩阵的形状和/或通道数,无需复制数据。 | |
void | resize (size_t sz) |
更改矩阵的行数。 | |
void | resize (size_t sz, const Scalar &s) |
Mat | row (int y) const |
为指定的矩阵行创建矩阵头。 | |
Mat | rowRange (const Range &r) const |
Mat | rowRange (int startrow, int endrow) const |
为指定的行范围创建矩阵头。 | |
Mat & | setTo (InputArray value, InputArray mask=noArray()) |
将所有或部分数组元素设置为指定值。 | |
size_t | step1 (int i=0) const |
返回归一化步长。 | |
MatExpr | t () const |
转置矩阵。 | |
size_t | total () const |
返回数组元素的总数。 | |
size_t | total (int startDim, int endDim=INT_MAX) const |
返回数组元素的总数。 | |
int | type () const |
返回矩阵元素的类型。 | |
void | updateContinuityFlag () |
内部使用方法:更新连续性标志 | |
静态公共成员函数 | |
static CV_NODISCARD_STD Mat | diag (const Mat &d) |
创建一个对角矩阵 | |
static CV_NODISCARD_STD MatExpr | eye (int rows, int cols, int type) |
返回指定大小和类型的单位矩阵。 | |
static CV_NODISCARD_STD MatExpr | eye (Size size, int type) |
static MatAllocator * | getDefaultAllocator () |
static MatAllocator * | getStdAllocator () |
以及标准分配器 | |
static CV_NODISCARD_STD MatExpr | ones (int ndims, const int *sz, int type) |
static CV_NODISCARD_STD MatExpr | ones (int rows, int cols, int type) |
返回指定大小和类型,所有元素均为1的数组。 | |
static CV_NODISCARD_STD MatExpr | ones (Size size, int type) |
static void | setDefaultAllocator (MatAllocator *allocator) |
static CV_NODISCARD_STD MatExpr | zeros (int ndims, const int *sz, int type) |
static CV_NODISCARD_STD MatExpr | zeros (int rows, int cols, int type) |
返回指定大小和类型,所有元素均为0的数组。 | |
static CV_NODISCARD_STD MatExpr | zeros (Size size, int type) |
公共属性 | |
MatAllocator * | allocator |
自定义分配器 | |
int | cols |
uchar * | data |
指向数据的指针 | |
const uchar * | dataend |
const uchar * | datalimit |
const uchar * | datastart |
在locateROI和adjustROI中使用的辅助字段 | |
int | dims |
矩阵维数,>= 2 | |
int | flags |
int | rows |
行和列的数量,或者当矩阵的维数大于2时为(-1, -1) | |
MatSize | size |
MatStep | step |
UMatData * | u |
与UMat 的交互 | |
受保护的成员函数 | |
template<typename _Tp , typename Functor > | |
void | forEach_impl (const Functor &operation) |
类Mat表示一个n维密集数值单通道或多通道数组。它可以用来存储实数或复数值向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图(不过,非常高维的直方图最好存储在SparseMat中)。数组M
的数据布局由数组M.step[]
定义,因此元素\((i_0,...,i_{M.dims-1})\)的地址(其中\(0\leq i_k<M.size[k]\))计算如下:
\[addr(M_{i_0,...,i_{M.dims-1}}) = M.data + M.step[0]*i_0 + M.step[1]*i_1 + ... + M.step[M.dims-1]*i_{M.dims-1}\]
对于二维数组,上述公式简化为:
\[addr(M_{i,j}) = M.data + M.step[0]*i + M.step[1]*j\]
注意M.step[i] >= M.step[i+1]
(实际上,M.step[i] >= M.step[i+1]*M.size[i+1]
)。这意味着二维矩阵按行存储,三维矩阵按平面存储,依此类推。M.step[M.dims-1]是最小的,并且始终等于元素大小M.elemSize()。
因此,Mat中的数据布局与标准工具包和SDK中的大多数密集数组类型兼容,例如Numpy(ndarray)、Win32(独立设备位图)等,即任何使用步长(或步幅)来计算像素位置的数组。由于这种兼容性,可以为用户分配的数据创建一个Mat头,并使用OpenCV函数就地处理它。
创建Mat对象有很多不同的方法。最常用的选项如下所示
clone()
方法。<< 运算符
,后跟逗号分隔的值,这些值可以是常量、变量、表达式等等。另外,请注意避免编译错误所需的额外括号。创建数组后,将通过引用计数机制自动管理它。如果数组头部构建在用户分配的数据之上,则应自行处理数据。当没有人指向它时,将释放数组数据。如果您想在调用数组析构函数之前释放数组头部指向的数据,请使用 Mat::release()。
关于数组类需要学习的下一个重要内容是元素访问。本手册已描述如何计算每个数组元素的地址。通常,您不需要在代码中直接使用公式。如果您知道数组元素类型(可以使用方法 Mat::type() 获取),则可以访问二维数组的元素\(M_{ij}\) 为
假设M
是一个双精度浮点数数组。该方法针对不同维数有多个变体。
如果需要处理二维数组的一整行,最有效的方法是首先获取该行的指针,然后直接使用普通的C运算符 []
某些操作(如上面的操作)实际上并不依赖于数组形状。它们只是逐个处理数组元素(或者处理来自具有相同坐标的多个数组的元素,例如,数组加法)。此类操作称为逐元素操作。检查所有输入/输出数组是否连续,即每一行末尾都没有间隙,是有意义的。如果是,则将它们作为单个长行处理。
对于连续矩阵,外循环体只执行一次。因此,开销更小,在小型矩阵的情况下尤其明显。
最后,还有STL风格的迭代器,它们足够智能,可以跳过连续行之间的间隙。
矩阵迭代器是随机访问迭代器,因此可以传递给任何STL算法,包括std::sort()。
cv::Mat::Mat | ( | ) |
这些是构成矩阵的各种构造函数。如自动分配中所述,默认构造函数通常就足够了,OpenCV 函数将分配正确的矩阵。构造的矩阵可以进一步赋值给另一个矩阵或矩阵表达式,也可以使用Mat::create进行分配。在前一种情况下,旧内容将被解除引用。
cv::Mat::Mat | ( | int | rows, |
int | cols, | ||
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
rows | 二维数组的行数。 |
cols | 二维数组的列数。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
cv::Mat::Mat | ( | Size | size, |
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 二维数组大小:Size(cols, rows)。在 Size() 构造函数中,行数和列数的顺序相反。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
cv::Mat::Mat | ( | int | rows, |
int | cols, | ||
int | type, | ||
const Scalar & | s ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
rows | 二维数组的行数。 |
cols | 二维数组的列数。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
s | 一个可选值,用于初始化每个矩阵元素。要在构造之后将所有矩阵元素设置为特定值,请使用赋值运算符Mat::operator=(const Scalar& value)。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 二维数组大小:Size(cols, rows)。在 Size() 构造函数中,行数和列数的顺序相反。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
s | 一个可选值,用于初始化每个矩阵元素。要在构造之后将所有矩阵元素设置为特定值,请使用赋值运算符Mat::operator=(const Scalar& value)。 |
cv::Mat::Mat | ( | int | ndims, |
const int * | sizes, | ||
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 数组维度。 |
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
cv::Mat::Mat | ( | const std::vector< int > & | sizes, |
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
cv::Mat::Mat | ( | int | ndims, |
const int * | sizes, | ||
int | type, | ||
const Scalar & | s ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 数组维度。 |
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
s | 一个可选值,用于初始化每个矩阵元素。要在构造之后将所有矩阵元素设置为特定值,请使用赋值运算符Mat::operator=(const Scalar& value)。 |
cv::Mat::Mat | ( | const std::vector< int > & | sizes, |
int | type, | ||
const Scalar & | s ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
s | 一个可选值,用于初始化每个矩阵元素。要在构造之后将所有矩阵元素设置为特定值,请使用赋值运算符Mat::operator=(const Scalar& value)。 |
cv::Mat::Mat | ( | const Mat & | m | ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 将(整体或部分)赋值给构造矩阵的数组。这些构造函数不会复制数据。相反,它构造并关联指向m数据或其子数组的头部。任何引用计数器都会递增。因此,当您修改使用此类构造函数形成的矩阵时,您也会修改m的相应元素。如果您想要子数组的独立副本,请使用 Mat::clone() 。 |
cv::Mat::Mat | ( | int | rows, |
int | cols, | ||
int | type, | ||
void * | data, | ||
size_t | step = AUTO_STEP ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
rows | 二维数组的行数。 |
cols | 二维数组的列数。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
data | 指向用户数据的指针。获取数据和步长参数的矩阵构造函数不会分配矩阵数据。相反,它们只初始化指向指定数据的矩阵头,这意味着没有数据被复制。此操作非常高效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此您应该小心处理它。 |
step | 每行矩阵占用的字节数。该值应包含每行末尾的填充字节(如果有)。如果参数缺失(设置为AUTO_STEP),则不假设填充,并且实际步长计算为cols*elemSize()。参见 Mat::elemSize。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 二维数组大小:Size(cols, rows)。在 Size() 构造函数中,行数和列数的顺序相反。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
data | 指向用户数据的指针。获取数据和步长参数的矩阵构造函数不会分配矩阵数据。相反,它们只初始化指向指定数据的矩阵头,这意味着没有数据被复制。此操作非常高效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此您应该小心处理它。 |
step | 每行矩阵占用的字节数。该值应包含每行末尾的填充字节(如果有)。如果参数缺失(设置为AUTO_STEP),则不假设填充,并且实际步长计算为cols*elemSize()。参见 Mat::elemSize。 |
cv::Mat::Mat | ( | int | ndims, |
const int * | sizes, | ||
int | type, | ||
void * | data, | ||
const size_t * | steps = 0 ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 数组维度。 |
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
data | 指向用户数据的指针。获取数据和步长参数的矩阵构造函数不会分配矩阵数据。相反,它们只初始化指向指定数据的矩阵头,这意味着没有数据被复制。此操作非常高效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此您应该小心处理它。 |
steps | 对于多维数组,ndims-1个步长的数组(最后一个步长始终设置为元素大小)。如果未指定,则假设矩阵是连续的。 |
cv::Mat::Mat | ( | const std::vector< int > & | sizes, |
int | type, | ||
void * | data, | ||
const size_t * | steps = 0 ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
sizes | 指定n维数组形状的整数数组。 |
type | 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 通道)矩阵。 |
data | 指向用户数据的指针。获取数据和步长参数的矩阵构造函数不会分配矩阵数据。相反,它们只初始化指向指定数据的矩阵头,这意味着没有数据被复制。此操作非常高效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此您应该小心处理它。 |
steps | 对于多维数组,ndims-1个步长的数组(最后一个步长始终设置为元素大小)。如果未指定,则假设矩阵是连续的。 |
cv::Mat::Mat | ( | const Mat & | m, |
const Range & | rowRange, | ||
const Range & | colRange = Range::all() ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 将(整体或部分)赋值给构造矩阵的数组。这些构造函数不会复制数据。相反,它构造并关联指向m数据或其子数组的头部。任何引用计数器都会递增。因此,当您修改使用此类构造函数形成的矩阵时,您也会修改m的相应元素。如果您想要子数组的独立副本,请使用 Mat::clone() 。 |
rowRange | 要获取的m行的Range。通常,范围起始值包含在内,范围结束值不包含在内。使用 Range::all() 获取所有行。 |
colRange | 要获取的m列的Range。使用 Range::all() 获取所有列。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 将(整体或部分)赋值给构造矩阵的数组。这些构造函数不会复制数据。相反,它构造并关联指向m数据或其子数组的头部。任何引用计数器都会递增。因此,当您修改使用此类构造函数形成的矩阵时,您也会修改m的相应元素。如果您想要子数组的独立副本,请使用 Mat::clone() 。 |
roi | 感兴趣区域。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 将(整体或部分)赋值给构造矩阵的数组。这些构造函数不会复制数据。相反,它构造并关联指向m数据或其子数组的头部。任何引用计数器都会递增。因此,当您修改使用此类构造函数形成的矩阵时,您也会修改m的相应元素。如果您想要子数组的独立副本,请使用 Mat::clone() 。 |
ranges | 沿每个维度选择的m范围数组。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 将(整体或部分)赋值给构造矩阵的数组。这些构造函数不会复制数据。相反,它构造并关联指向m数据或其子数组的头部。任何引用计数器都会递增。因此,当您修改使用此类构造函数形成的矩阵时,您也会修改m的相应元素。如果您想要子数组的独立副本,请使用 Mat::clone() 。 |
ranges | 沿每个维度选择的m范围数组。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
vec | 其元素构成矩阵的STL向量。矩阵只有一列,行数等于向量元素数。矩阵的类型与向量元素的类型匹配。构造函数可以处理任意类型,这些类型都有正确声明的 DataType 。这意味着向量元素必须是原始数字或数字的单类型数值元组。不支持混合类型结构。相应的构造函数是显式的。由于STL向量不会自动转换为 Mat 实例,因此您应该显式编写Mat(vec)。除非您将数据复制到矩阵中 (copyData=true),否则不会向向量中添加任何新元素,因为这可能会导致向量数据重新分配,从而使矩阵数据指针无效。 |
copyData | 标志,用于指定是否应将STL向量的底层数据复制到 (true) 或与 (false) 新构造的矩阵共享。当复制数据时,分配的缓冲区使用 Mat 引用计数机制进行管理。当数据共享时,引用计数器为NULL,您应该在矩阵销毁之前不要释放数据。 |
|
explicit |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
explicit |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
explicit |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
explicit |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
explicit |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
explicit |
从 GpuMat 下载数据
cv::Mat::~Mat | ( | ) |
析构函数 - 调用 release()
cv::Mat::Mat | ( | Mat && | m | ) |
void cv::Mat::addref | ( | ) |
递增引用计数器。
此方法会递增与矩阵数据关联的引用计数器。如果矩阵头指向外部数据集(参见Mat::Mat),则引用计数器为 NULL,在这种情况下,此方法无效。通常,为避免内存泄漏,不应显式调用此方法。它由矩阵赋值运算符隐式调用。在支持原子操作的平台上,引用计数器递增是一个原子操作。因此,可以在不同的线程中异步操作相同的矩阵。
Mat & cv::Mat::adjustROI | ( | int | 顶部偏移量, |
int | 底部偏移量, | ||
int | 左边偏移量, | ||
int | dright ) |
调整父矩阵内子矩阵的大小和位置。
此方法与Mat::locateROI 相互补充。这些函数的典型用法是确定子矩阵在父矩阵中的位置,然后以某种方式移动该位置。通常,在需要考虑 ROI 外部像素的滤波操作中需要这样做。当所有方法参数都为正数时,ROI 需要在所有方向上按指定量增长,例如
在此示例中,矩阵大小在每个方向上增加了 4 个元素。矩阵向左移动了 2 个元素,向上移动了 2 个元素,这引入了使用 5x5 核进行滤波所需的所有像素。
adjustROI 强制调整后的 ROI 位于父矩阵内,即调整后 ROI 的边界受父矩阵边界的约束。例如,如果子矩阵 A 位于父矩阵的第一行,并且您调用 A.adjustROI(2, 2, 2, 2),则 A 将不会向上增大。
此函数由 OpenCV 滤波函数(如 filter2D、形态学运算等)内部使用。
顶部偏移量 | 向上移动顶部子矩阵边界。 |
底部偏移量 | 向下移动底部子矩阵边界。 |
左边偏移量 | 向左移动左侧子矩阵边界。 |
dright | 向右移动右侧子矩阵边界。 |
void cv::Mat::assignTo | ( | Mat & | m, |
int | type = -1 ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
idx | 包含Mat::dims索引的数组。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
idx | 包含Mat::dims索引的数组。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
i0 | 维度 0 的索引 |
i1 | 维度 1 的索引 |
i2 | 维度 2 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
i0 | 维度 0 的索引 |
i1 | 维度 1 的索引 |
i2 | 维度 2 的索引 |
返回对指定数组元素的引用。
模板方法返回对指定数组元素的引用。为了提高性能,仅在调试配置中执行索引范围检查。
请注意,具有单个索引 (i) 的变体可用于访问单行或单列二维数组的元素。也就是说,例如,如果 A 是一个 1 x N 浮点矩阵,而 B 是一个 M x 1 整数矩阵,您可以简单地编写 A.at<float>(k+4)
和 B.at<int>(2*i+1)
,而不是分别编写 A.at<float>(0,k+4)
和 B.at<int>(2*i+1,0)
。
下面的示例初始化一个希尔伯特矩阵
请记住,在 at 运算符中使用的尺寸标识符不能随意选择。它取决于您尝试从中检索数据的图像。下表对此进行了更好的说明
CV_8U
,则使用 Mat.at<uchar>(y,x)
。CV_8S
,则使用 Mat.at<schar>(y,x)
。CV_16U
,则使用 Mat.at<ushort>(y,x)
。CV_16S
,则使用 Mat.at<short>(y,x)
。CV_32S
,则使用 Mat.at<int>(y,x)
。CV_32F
,则使用 Mat.at<float>(y,x)
。CV_64F
,则使用 Mat.at<double>(y,x)
。i0 | 维度 0 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
i0 | 维度 0 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。二维数组的特殊版本(尤其方便引用图像像素)。
pt | 元素位置指定为 Point(j,i)。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。二维数组的特殊版本(尤其方便引用图像像素)。
pt | 元素位置指定为 Point(j,i)。 |
MatIterator_< _Tp > cv::Mat::begin | ( | ) |
返回矩阵迭代器并将其设置为第一个矩阵元素。
这些方法返回矩阵的只读或读写迭代器。矩阵迭代器的使用与双向STL迭代器的使用非常相似。在下面的示例中,使用矩阵迭代器重写了alpha混合函数。
MatConstIterator_< _Tp > cv::Mat::begin | ( | ) | const |
int cv::Mat::channels | ( | ) | const |
返回矩阵通道数。
此方法返回矩阵的通道数。
int cv::Mat::checkVector | ( | int | elemChannels, |
int | depth = -1, | ||
bool | requireContinuous = true ) const |
elemChannels | 矩阵应具有的通道数或列数。对于二维矩阵,当矩阵只有一列时,它应具有elemChannels通道;当矩阵只有一个通道时,它应具有elemChannels列。对于三维矩阵,它应该只有一个通道。此外,如果平面的数量不是1,则每个平面内的行数必须为1;如果每个平面内的行数不是1,则平面的数量必须为1。 |
depth | 矩阵应具有的深度。如果任何深度都可以,则将其设置为-1。 |
requireContinuous | 将其设置为true以要求矩阵是连续的。 |
以下代码演示了其在二维矩阵中的用法
以下代码演示了其在三维矩阵中的用法
CV_NODISCARD_STD Mat cv::Mat::clone | ( | ) | const |
创建数组及其底层数据的完整副本。
此方法创建数组的完整副本。不会考虑原始 step[]。因此,数组副本是一个连续数组,占用 total()*elemSize() 字节。
Mat cv::Mat::col | ( | int | x | ) | const |
为指定的矩阵列创建一个矩阵头。
此方法为指定的矩阵列创建一个新的头,并返回它。无论矩阵大小如何,这都是一个 O(1) 操作。新矩阵的基础数据与原始矩阵共享。另请参见 Mat::row 说明。
x | 基于 0 的列索引。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
r | Range 结构体,包含起始和结束索引。 |
Mat cv::Mat::colRange | ( | int | startcol, |
int | endcol ) const |
void cv::Mat::convertTo | ( | OutputArray | m, |
int | rtype, | ||
double | alpha = 1, | ||
double | beta = 0 ) const |
将数组转换为另一种数据类型,并可以选择缩放。
此方法将源像素值转换为目标数据类型。最后应用 saturate_cast<> 以避免可能的溢出
\[m(x,y) = saturate \_ cast<rType>( \alpha (*this)(x,y) + \beta )\]
m | 输出矩阵;如果在操作之前没有适当的大小或类型,则会重新分配它。 |
rtype | 所需的输出矩阵类型,或者说是深度,因为通道数与输入相同;如果 rtype 为负数,则输出矩阵将与输入具有相同的类型。 |
alpha | 可选比例因子。 |
beta | 添加到缩放值的可选增量。 |
void cv::Mat::copySize | ( | const Mat & | m | ) |
内部使用函数;正确地重新分配 _size、_step 数组
void cv::Mat::copyTo | ( | OutputArray | m | ) | const |
将矩阵复制到另一个矩阵。
此方法将矩阵数据复制到另一个矩阵。在复制数据之前,该方法会调用
以便根据需要重新分配目标矩阵。虽然 m.copyTo(m); 可以完美运行,但该函数没有处理源矩阵和目标矩阵之间部分重叠的情况。
当指定操作掩码时,如果上面显示的 Mat::create 调用重新分配矩阵,则在复制数据之前,新分配的矩阵将用全零初始化。
m | 目标矩阵。如果在操作之前没有适当的大小或类型,则会重新分配它。 |
void cv::Mat::copyTo | ( | OutputArray | m, |
InputArray | mask ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 目标矩阵。如果在操作之前没有适当的大小或类型,则会重新分配它。 |
mask | 与 *this 大小相同的操作掩码。其非零元素指示需要复制哪些矩阵元素。掩码必须是 CV_8U 类型,并且可以有 1 个或多个通道。 |
void cv::Mat::create | ( | const std::vector< int > & | sizes, |
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
sizes | 指定新数组形状的整数数组。 |
type | 新的矩阵类型。 |
void cv::Mat::create | ( | int | ndims, |
const int * | sizes, | ||
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 新的数组维度。 |
sizes | 指定新数组形状的整数数组。 |
type | 新的矩阵类型。 |
void cv::Mat::create | ( | int | rows, |
int | cols, | ||
int | type ) |
根据需要分配新的数组数据。
这是Mat的关键方法之一。大多数新式OpenCV函数和生成数组的方法都会为每个输出数组调用此方法。该方法使用以下算法:
这种方案使内存管理同时具有健壮性和效率,并帮助您避免额外的输入。这意味着通常不需要显式分配输出数组。也就是说,不用编写
您可以简单地编写
因为cvtColor以及大多数OpenCV函数都在内部为输出数组调用Mat::create()。
rows | 新的行数。 |
cols | 新的列数。 |
type | 新的矩阵类型。 |
void cv::Mat::create | ( | Size | size, |
int | type ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 替代的新矩阵大小规范:Size(cols, rows) |
type | 新的矩阵类型。 |
Mat cv::Mat::cross | ( | InputArray | m | ) | const |
计算两个三元素向量的叉积。
该方法计算两个3元素向量的叉积。向量必须是相同形状和大小的3元素浮点向量。结果是另一个与操作数具有相同形状和类型的3元素向量。
m | 另一个叉积操作数。 |
void cv::Mat::deallocate | ( | ) |
内部使用函数,建议改用“release”方法;释放矩阵数据
int cv::Mat::depth | ( | ) | const |
返回矩阵元素的深度。
该方法返回矩阵元素深度的标识符(每个单独通道的类型)。例如,对于16位有符号元素数组,该方法返回CV_16S。矩阵类型的完整列表包含以下值:
|
static |
创建一个对角矩阵
该方法根据指定的对角线创建方对角矩阵。
d | 表示主对角线的一维矩阵。 |
Mat cv::Mat::diag | ( | int | d = 0 | ) | const |
double cv::Mat::dot | ( | InputArray | m | ) | const |
计算两个向量的点积。
该方法计算两个矩阵的点积。如果矩阵不是单列或单行向量,则使用从上到下、从左到右的扫描顺序将它们视为一维向量。向量必须具有相同的大小和类型。如果矩阵具有多个通道,则所有通道的点积都将相加。
m | 另一个点积操作数。 |
size_t cv::Mat::elemSize | ( | ) | const |
返回矩阵元素的大小(以字节为单位)。
该方法返回矩阵元素的大小(以字节为单位)。例如,如果矩阵类型为CV_16SC3,则该方法返回3*sizeof(short)或6。
size_t cv::Mat::elemSize1 | ( | ) | const |
返回每个矩阵元素通道的大小(以字节为单位)。
该方法返回矩阵元素通道大小(以字节为单位),即忽略通道数。例如,如果矩阵类型为 CV_16SC3,则该方法返回 sizeof(short) 或 2。
bool cv::Mat::empty | ( | ) | const |
如果数组没有元素,则返回 true。
如果 Mat::total() 为 0 或 Mat::data 为 NULL,则该方法返回 true。由于 pop_back() 和 resize() 方法,M.total() == 0
并不意味着M.data == NULL
。
MatIterator_< _Tp > cv::Mat::end | ( | ) |
返回矩阵迭代器并将其设置为最后一个矩阵元素之后。
该方法返回矩阵的只读或读写迭代器,设置为最后一个矩阵元素后面的点。
MatConstIterator_< _Tp > cv::Mat::end | ( | ) | const |
|
static |
|
static |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 作为 Size(cols, rows) 的替代矩阵大小规范。 |
type | 创建的矩阵类型。 |
void cv::Mat::forEach | ( | const Functor & | operation | ) |
并行运行给定的函数体遍历所有矩阵元素。
作为参数传递的操作必须是函数指针、函数对象或 lambda(C++11)。
示例 1. 下面的所有操作都将 0xFF 置于所有矩阵元素的第一个通道。
示例 2. 使用像素的位置
void cv::Mat::forEach | ( | const Functor & | operation | ) | const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
|
static |
|
static |
以及标准分配器
UMat cv::Mat::getUMat |
( | 访问标志 | accessFlags, |
UMatUsageFlags | usageFlags = USAGE_DEFAULT ) const |
求矩阵的逆。
该方法通过矩阵表达式执行矩阵求逆。这意味着该方法返回一个临时的矩阵求逆对象,可以进一步用作更复杂的矩阵表达式的一部分,或者可以赋值给矩阵。
method | 矩阵求逆方法。cv::DecompTypes 中的一种 |
bool cv::Mat::isContinuous | ( | ) | const |
报告矩阵是否连续。
如果矩阵元素连续存储,没有行尾间隙,则该方法返回true。否则,返回false。显然,1x1或1xN矩阵始终是连续的。使用Mat::create
创建的矩阵始终是连续的。但是,如果您使用Mat::col
、Mat::diag
等等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则这些矩阵可能不再具有此属性。
连续性标志存储在Mat::flags
字段中的一个位中,并在您构造矩阵头时自动计算。因此,连续性检查是一个非常快的操作,尽管理论上可以按如下方式完成
该方法在相当多的OpenCV函数中使用。关键在于逐元素操作(例如算术和逻辑运算、数学函数、alpha混合、颜色空间转换等等)不依赖于图像几何。因此,如果所有输入和输出数组都是连续的,则函数可以将它们处理为非常长的单行向量。下面的示例说明了如何实现 alpha 混合函数
type
() == CV_MAKETYPE
(traits::Depth<T>::value, 4) &&size
.height = 1;size
.width *= 4;ptr
<T>(i);ptr
<T>(i);ptr
<T>(i);saturate_cast<T>
(ptr1[j]*alpha + ptr2[j]*beta);saturate_cast<T>
(ptr1[j+1]*alpha + ptr2[j+1]*beta);saturate_cast<T>
(ptr1[j+2]*alpha + ptr2[j+2]*beta);saturate_cast<T>
((1 - (1-alpha)*(1-beta))*alpha_scale);这种方法虽然非常简单,但可以将简单的元素操作的性能提高 10-20%,尤其是在图像较小且操作相当简单的情况下。
此函数中的另一个 OpenCV 习惯用法是对目标数组调用Mat::create
,除非目标数组已经具有正确的尺寸和类型,否则分配目标数组。虽然新分配的数组总是连续的,但您仍然需要检查目标数组,因为Mat::create
并不总是分配一个新矩阵。
bool cv::Mat::isSubmatrix | ( | ) | const |
如果矩阵是另一个矩阵的子矩阵,则返回 true
定位父矩阵内的矩阵头。
使用Mat::row、Mat::col、Mat::rowRange、Mat::colRange等方法从矩阵中提取子矩阵后,生成的子矩阵仅指向原始大矩阵的一部分。但是,每个子矩阵都包含信息(由datastart和dataend字段表示),这些信息有助于重建原始矩阵的大小以及提取的子矩阵在原始矩阵中的位置。locateROI方法正是这样做的。
wholeSize | 输出参数,包含包含this作为一部分的整个矩阵的大小。 |
ofs | 输出参数,包含this在整个矩阵内的偏移量。 |
MatExpr cv::Mat::mul | ( | InputArray | m, |
double | scale = 1 ) const |
对两个矩阵执行逐元素乘法或除法。
此方法返回一个临时对象,该对象对每个元素的数组乘法进行编码,并带有可选的比例因子。请注意,这不是对应于更简单的“\*”运算符的矩阵乘法。
示例
m | 另一个与*this类型和大小相同的数组,或矩阵表达式。 |
scale | 可选比例因子。 |
|
static |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 数组维度。 |
sz | 指定数组形状的整数数组。 |
type | 创建的矩阵类型。 |
|
static |
返回指定大小和类型,所有元素均为1的数组。
此方法返回一个 Matlab 风格的全是 1 的数组初始化器,类似于Mat::zeros。请注意,使用此方法,您可以使用以下 Matlab 习惯用法初始化具有任意值的数组
上述操作不会形成一个 100x100 的全是 1 的矩阵,然后乘以 3。相反,它只记住比例因子(在这种情况下为 3),并在实际调用矩阵初始化器时使用它。
rows | 行数。 |
cols | 列数。 |
type | 创建的矩阵类型。 |
|
static |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 矩阵大小规范Size(cols, rows) 的替代方法。 |
type | 创建的矩阵类型。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ranges | 沿着每个数组维度选择的范围数组。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
roi | 指定为矩形的提取子矩阵。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ranges | 沿着每个数组维度选择的范围数组。 |
提取矩形子矩阵。
这些运算符为*this的指定子数组创建新的头。它们是Mat::row、Mat::col、Mat::rowRange和Mat::colRange 的最通用形式。例如,A(Range(0, 10), Range::all())
等同于 A.rowRange(0, 10)
。与以上所有方法类似,这些运算符都是 O(1) 操作,也就是说,没有复制矩阵数据。
rowRange | 提取子矩阵的起始行和结束行。不包含上限。要选择所有行,请使用Range::all()。 |
colRange | 提取子矩阵的起始列和结束列。不包含上限。要选择所有列,请使用Range::all()。 |
赋值运算符
这些是可用的赋值运算符。由于它们都非常不同,请务必阅读运算符参数说明。
m | 被赋值的右侧矩阵。矩阵赋值是一个 O(1) 操作。这意味着没有复制数据,而是共享数据,并且如果有的话,引用计数会递增。在赋值新数据之前,旧数据通过Mat::release 进行取消引用。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
expr | 赋值矩阵表达式对象。与赋值操作的第一个形式相反,第二个形式可以在已分配的矩阵具有正确的尺寸和类型以适应矩阵表达式结果的情况下重用该矩阵。这由矩阵表达式扩展到的实际函数自动处理。例如,C=A+B 将扩展为 add(A, B, C),而 add 会处理 C 的自动重新分配。 |
void cv::Mat::pop_back | ( | size_t | nelems = 1 | ) |
删除矩阵底部的元素。
此方法从矩阵底部删除一行或多行。
nelems | 删除的行数。如果大于总行数,则抛出异常。 |
uchar * cv::Mat::ptr | ( | const int * | idx | ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
const uchar * cv::Mat::ptr | ( | const int * | idx | ) | const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
uchar * cv::Mat::ptr | ( | int | i0, |
int | i1, | ||
int | i2 ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
const uchar * cv::Mat::ptr | ( | int | i0, |
int | i1, | ||
int | i2 ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
uchar * cv::Mat::ptr | ( | int | i0 = 0 | ) |
const uchar * cv::Mat::ptr | ( | int | i0 = 0 | ) | const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
uchar * cv::Mat::ptr | ( | int | row, |
int | col ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
const uchar * cv::Mat::ptr | ( | int | row, |
int | col ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
row | 维度 0 的索引 |
col | 维度 1 的索引 |
在矩阵底部添加元素。
这些方法将一个或多个元素添加到矩阵底部。它们模拟 STL vector 类的相应方法。当 elem 为 Mat 时,其类型和列数必须与容器矩阵中的相同。
elem | 添加的元素。 |
void cv::Mat::push_back | ( | const Mat & | m | ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
m | 添加的行。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
elem | 添加的元素。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
elem | 添加的元素。 |
void cv::Mat::push_back_ | ( | const void * | elem | ) |
内部函数
std::reverse_iterator< MatIterator_< _Tp > > cv::Mat::rbegin | ( | ) |
与begin()相同,但用于逆向遍历。
std::reverse_iterator< MatConstIterator_< _Tp > > cv::Mat::rbegin | ( | ) | const |
void cv::Mat::release | ( | ) |
递减引用计数器,如果需要则释放矩阵。
此方法递减与矩阵数据关联的引用计数器。当引用计数器达到 0 时,矩阵数据将被释放,数据和引用计数器指针将设置为 NULL。如果矩阵头指向外部数据集(参见 Mat::Mat),则引用计数器为 NULL,在这种情况下,此方法无效。
可以手动调用此方法以强制执行矩阵数据释放。但是,由于此方法在析构函数中或通过任何其他更改数据指针的方法自动调用,因此通常不需要它。在支持它的平台上,引用计数器递减和检查 0 是一个原子操作。因此,可以在不同线程中异步操作相同的矩阵是安全的。
std::reverse_iterator< MatIterator_< _Tp > > cv::Mat::rend | ( | ) |
与end()相同,但用于逆向遍历。
std::reverse_iterator< MatConstIterator_< _Tp > > cv::Mat::rend | ( | ) | const |
void cv::Mat::reserve | ( | size_t | sz | ) |
为特定数量的行预留空间。
此方法为 sz 行预留空间。如果矩阵已经有足够的存储 sz 行的空间,则不会发生任何事情。如果矩阵被重新分配,则将保留前 Mat::rows 行。此方法模拟 STL vector 类的相应方法。
sz | 行数。 |
void cv::Mat::reserveBuffer | ( | size_t | sz | ) |
为特定数量的字节预留空间。
此方法为 sz 字节预留空间。如果矩阵已经有足够的存储 sz 字节的空间,则不会发生任何事情。如果必须重新分配矩阵,则其以前的内容可能会丢失。
sz | 字节数。 |
Mat cv::Mat::reshape | ( | int | cn, |
const std::vector< int > & | newshape ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
cn | 新的通道数。如果参数为 0,则通道数保持不变。 |
newshape | 包含所有维度的新矩阵大小的向量。如果某些大小为零,则假定这些维度中的原始大小。 |
Mat cv::Mat::reshape | ( | int | cn, |
int | newndims, | ||
const int * | newsz ) const |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
cn | 新的通道数。如果参数为 0,则通道数保持不变。 |
newndims | 新的维度数。 |
newsz | 包含所有维度的新矩阵大小的数组。如果某些大小为零,则假定这些维度中的原始大小。 |
Mat cv::Mat::reshape | ( | int | cn, |
int | rows = 0 ) const |
更改二维矩阵的形状和/或通道数,无需复制数据。
此方法为*this元素创建一个新的矩阵头。新的矩阵可能具有不同的尺寸和/或不同的通道数。如果满足以下条件,则任何组合都是可能的:
例如,如果有一组存储为STL向量的3D点,并且您想将这些点表示为3xN矩阵,请执行以下操作:
3通道2x2矩阵重塑为1通道4x3矩阵,每一列的值来自原始通道之一
或者
cn | 新的通道数。如果参数为 0,则通道数保持不变。 |
rows | 新行数。如果参数为0,则行数保持不变。 |
void cv::Mat::resize | ( | size_t | sz | ) |
更改矩阵的行数。
这些方法改变矩阵的行数。如果矩阵被重新分配,则前min(Mat::rows, sz)行将被保留。这些方法模拟STL向量类的相应方法。
sz | 新的行数。 |
void cv::Mat::resize | ( | size_t | sz, |
const Scalar & | s ) |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
sz | 新的行数。 |
s | 分配给新添加元素的值。 |
Mat cv::Mat::row | ( | int | y | ) | const |
为指定的矩阵行创建矩阵头。
此方法为指定的矩阵行创建一个新的头并返回它。无论矩阵大小如何,这都是一个O(1)操作。新矩阵的基础数据与原始矩阵共享。以下是一个经典的基本矩阵处理操作axpy的示例,它被LU和许多其他算法使用:
y | 基于 0 的行索引。 |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
r | Range 结构体,包含起始和结束索引。 |
Mat cv::Mat::rowRange | ( | int | startrow, |
int | endrow ) const |
|
static |
Mat & cv::Mat::setTo | ( | InputArray | value, |
InputArray | mask = noArray() ) |
将所有或部分数组元素设置为指定值。
这是Mat::operator=(const Scalar& s)运算符的高级变体。
value | 将标量赋值并转换为实际的数组类型。 |
mask | 与*this大小相同的操作掩码。其非零元素指示需要复制哪些矩阵元素。掩码必须是CV_8U类型,并且可以具有1个或多个通道。 |
size_t cv::Mat::step1 | ( | int | i = 0 | ) | const |
返回归一化步长。
此方法返回矩阵步长除以Mat::elemSize1()的结果。它可以用于快速访问任意矩阵元素。
MatExpr cv::Mat::t | ( | ) | const |
转置矩阵。
此方法使用矩阵表达式执行矩阵转置。它不执行实际的转置,而是返回一个临时矩阵转置对象,该对象可以进一步用作更复杂的矩阵表达式的一部分,或者可以赋值给矩阵。
size_t cv::Mat::total | ( | ) | const |
size_t cv::Mat::total | ( | int | startDim, |
int | endDim = INT_MAX ) const |
返回数组元素的总数。
此方法返回特定子数组切片中元素的数量,其中 startDim <= dim < endDim。
int cv::Mat::type | ( | ) | const |
返回矩阵元素的类型。
此方法返回矩阵元素类型。这是一个与CvMat类型系统兼容的标识符,例如CV_16SC3或16位有符号3通道数组等等。
void cv::Mat::updateContinuityFlag | ( | ) |
内部使用方法:更新连续性标志
|
static |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
ndims | 数组维度。 |
sz | 指定数组形状的整数数组。 |
type | 创建的矩阵类型。 |
|
static |
返回指定大小和类型,所有元素均为0的数组。
此方法返回一个Matlab风格的零数组初始化器。它可以用来快速创建一个常量数组作为函数参数、矩阵表达式的一部分或矩阵初始化器。
在上面的例子中,只有当A不是一个3x3浮点矩阵时,才会分配一个新的矩阵。否则,现有的矩阵A将被填充为零。
rows | 行数。 |
cols | 列数。 |
type | 创建的矩阵类型。 |
|
static |
这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅在于它接受的参数。
size | 矩阵大小规范Size(cols, rows) 的替代方法。 |
type | 创建的矩阵类型。 |
MatAllocator* cv::Mat::allocator |
自定义分配器
int cv::Mat::cols |
uchar* cv::Mat::data |
指向数据的指针
const uchar* cv::Mat::dataend |
const uchar* cv::Mat::datalimit |
const uchar* cv::Mat::datastart |
在locateROI和adjustROI中使用的辅助字段
int cv::Mat::dims |
矩阵维数,>= 2
int cv::Mat::flags |
包含多个位域
int cv::Mat::rows |
行和列的数量,或者当矩阵的维数大于2时为(-1, -1)
MatSize cv::Mat::size |
MatStep cv::Mat::step |