OPenCV3.2中Mat对象常用函数属性总结Mat对象是OpenCV2.0之后引进的图像数据结构,它能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。
分了两个部分,头部与数据部分。
在使用Mat对象时,有以下四个要点需要注意:
1、输出图像的内存是自动分配的
2、使用OpenCV的C++接口,不需要考虑内存分配问题
3、赋值操作和拷贝构造函数只会复制头部分
4、使用clone与copyTo两个函数实现数据完全复制
下面我们就具体介绍一下公共成员函数和公共属性。
公共成员函数:
1、cv::Mat::Mat ( int rows,
int cols,
int type
)
参数:
rows2D数组中的行数
cols2D数组中的列数。
type数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
2、cv::Mat::Mat ( Size size,
int type
)
参数:
size 2D数组大小:Size(cols, rows)。
在Size()构造函数中,行数和列数以相反的顺序排列。
type 数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
3、cv::Mat::Mat ( int rows,
int cols,
int type,
const Scalar & s
)
参数:
rows2D数组中的行数。
cols 2D数组中的列数。
type数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
s 初始化每个矩阵元素的可选值。
在构建后将所有矩阵元素设置为特定值, 使用赋值运算符Mat::operator=(const Scalar& value) 。
4、cv::Mat::Mat ( Size size,
int type,
const Scalar & s
)
参数:
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) .
5、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通道)矩阵。
6、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) .
7、cv::Mat::Mat ( const Mat & m )
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
8、cv::Mat::Mat ( const Mat & m,
const Range & rowRange,
const Range & colRange = Range::all()
)
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有
引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
RowRange 要取的m的行范围。
通常,范围开始是包含的,范围结束是除外的。
使用Range::all() 获取所有行。
colRange要取m的列范围。
使用Range::all() 获取所有的列。
9、cv::Mat::Mat ( const Mat & m,
const Rect & roi
)
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
roi感兴趣区域.
10、_Tp& cv::Mat::at ( int i0 = 0 )
返回指定数组元素的引用。
下面的示例初始化一个Hilbert矩阵:
Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
for(int j = 0; j < H.cols; j++)
H.at<double>(i,j)=1./(i+j+1);
11、int channels () const
返回矩阵通道的数目。
12、Mat clone () const
创建数组的完整副本和底层数据。
13、void copyTo (OutputArray m) const
将矩阵复制到另一个矩阵。
参数
m目标矩阵。
如果在操作前没有适当的大小或类型,则重新分配
14、void create (int rows, int cols, int type)
分配新的数组数据
参数:
rows新的的行数。
cols 新列数。
type 新的矩阵类型。
15、int cv::Mat::depth ( ) const
返回矩阵元素的深度
该方法返回矩阵元素深度的标识符(每个单独通道的类型)。
例如,对于一个16位有符号的元素数组,该方法返回CV_16S。
矩阵类型的完整列表包含以下值: •CV_8U - 8-bit unsigned integers ( 0..255 )
•CV_8S - 8-bit signed integers ( -128..127 )
•CV_16U - 16-bit unsigned integers ( 0..65535 )
•CV_16S - 16-bit signed integers ( -32768..32767 )
•CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
•CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN ) •CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN ) 16、uchar* cv::Mat::ptr ( int i0 = 0 )
返回指定的矩阵行的指针。
参数:
i0 一个基于行的索引。
公共属性
1、int cv::Mat::cols
矩阵的列
2、uchar* cv::Mat::data
指向数据的指针
3、int cv::Mat::dims
矩阵维数,> = 2
4、int cv::Mat::rows
当矩阵有超过2个维度时,行数和列(- 1,- 1)的数目。