三、OpenCV 基本数据结构
(一)Mat 类
- Mat 类的构造函数和成员函数介绍
构造函数:
Mat 类有多种构造函数形式,以满足不同的初始化需求。
-
无参数构造函数:
Mat::Mat()
,它创建一个空的矩阵对象,可后续通过其他方法来分配内存和赋值数据。例如,Mat emptyMat;
创建了一个初始为空的 Mat 对象,可用于存储图像或其他数据矩阵。 -
以尺寸、数据类型和初始值构造:
Mat(int rows, int cols, int type, const Scalar& s = Scalar())
。其中,rows
表示矩阵的行数,cols
表示列数,type
指定数据类型(如CV_8UC3
表示 8 位无符号整数、3 通道,常用于彩色图像),Scalar
参数用于指定初始值,默认为 0。例如,Mat matrix(3, 4, CV_8UC1, Scalar(255));
创建了一个 3 行 4 列、每个元素为 8 位无符号整数且初始值为 255 的单通道矩阵。 -
从已有数据构造:可以使用指向外部数据的指针来创建 Mat。例如,
Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP)
,其中data
是指向数据的指针,step
是每行数据的字节数(如果是AUTO_STEP
,OpenCV 会自动计算)。这种方式在处理外部数据源(如从文件读取的数据)时很有用。
成员函数:
-
rows
和cols
函数:用于获取矩阵的行数和列数。例如,Mat image = imread("image.jpg"); int rowCount = image.rows; int colCount = image.cols;
可以获取加载图像的行数和列数,这对于遍历图像或确定图像尺寸非常有用。 -
channels()
函数:返回矩阵的通道数。对于彩色图像(如CV_8UC3
类型),它返回 3,表示有红、绿、蓝三个通道;对于灰度图像(如CV_8UC1
),返回 1。例如,int numChannels = image.channels();
可以获取图像的通道信息,在处理图像像素时可根据通道数进行不同的操作。 -
depth()
函数:获取矩阵元素的数据深度,即每个元素的数据类型所占用的位数。例如,CV_8U
数据类型的深度为 8 位,CV_32F
为 32 位浮点数。这对于了解数据精度和进行数据类型转换等操作有帮助。 -
at<type>(i, j)
函数:用于访问矩阵中的元素。这里的<type>
需要根据矩阵的数据类型指定,如at<uchar>(i, j)
用于访问CV_8UC1
类型矩阵的元素,at<Vec3b>(i, j)
用于访问CV_8UC3
类型矩阵(彩色图像)的元素。其中i
和j
分别是行和列索引。例如,在处理灰度图像时,可以通过image.at<uchar>(row, col) = newValue;
来修改特定位置的像素值。