OpenCV-C++ Mat对象的使用
这一篇文章中主要介绍有关Mat类的使用,主要包括:
- 通过构造函数定义Mat对象;
- Mat对象常用属性以及方法
- 创建一个空白图像并进行赋值
- 创建一个小数组
通过构造函数定义Mat对象
Mat
中提供了很多的构造函数,这里使用两种方式:
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
第一种方式的示例如下:
// 1. 通过构造函数定义Mat对象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象
dst = Scalar(127, 0, 255); // 填充值
// 显示图像
namedWindow("dst image", WINDOW_AUTOSIZE);
imshow("dst image", dst);
waitKey(0);
结果如下图所示:
当然,其中构造函数的两个参数也可以来自已有Mat
对象,如:
Mat dst = Mat(src.size(), src.type());
第二种使用构造函数定义Mat对象的示例如下:
// 2. 通过构造函数定义Mat对象
Mat dst = Mat(128, 128, CV_8UC3, Scalar(0, 0, 255));
Mat对象常用属性以及方法
- 展示以下Mat对象常用的属性:
// 1. 通过构造函数定义Mat对象
Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象
dst = Scalar(127, 0, 255); // 填充值
// 3. Mat对象常用属性
int rows = dst.rows; // 获取矩阵行
int cols = dst.cols; // 获取矩阵列
int dims = dst.dims; // 获取矩阵维度
printf("rows: %d, cols: %d, dims: %d\n", rows, cols, dims);
输出:
rows: 128, cols: 128, dims: 2
需要注意的是,OpenCV中维度dims
与通道channels
是两个不同概念:
-
维度
dims
表示矩阵的维度,如上面示例是\(128\times 128\)大小的矩阵,它的维度是2; -
通过
channels
表示矩阵中每个元素有几个值,这个示例是3个值,通道数为3;ix
- 演示一些Mat对象常用的方法:
// 4. Mat对象常用方法
int channels = dst.channels(); // 获取矩阵元素通道数
int depth = dst.depth(); // 获取每个像素的深度,0: CV_8U, 1: CV_8S,...
bool isEmpty = dst.empty();
printf("channels: %d, depth: %d, isEmpty: %d \n", channels, depth, isEmpty);
输出:
channels: 3, depth: 0, isEmpty: 0
- 演示一下如何复制Mat对象
分成两种情况,一种是对原始对象多了一个tmp暂存对象,原始对象改变,tmp对象也改变;另一种是完全构造一个新Mat对象;
第一种,有两种方式,分别是:使用赋值运算符和使用Mat类复制构造函数;
// 5. 复制Mat对象
// 5.1. tmp对象与原始对象绑定
Mat tmp = src; // 通过赋值运算符
Mat tmp2(src); // 通过复制构造函数
第二种,通过Mat::clone()
与copyTo()
方法:获得一个全新的Mat对象;
// 5.2 获得一个新的Mat对象
Mat dst1 = src.clone();
Mat dst2;
src.copyTo(dst2);
.prt
访问矩阵元素
获取图像第一行的第一个元素:
// 6. prt的使用
const uchar * firstRowElement = src.ptr<uchar>(0);
printf("First Row Element: %d\n", *firstRowElement);
- 其他方法
// 7. 其他方法
Mat dstOther1 = Mat::zeros(src.size(), src.type()); // 创建全1矩阵
Mat dstOther2 = Mat::ones(src.size(), src.type()); // 创建零矩阵
Mat dstOther3 = Mat::eye(src.size(), src.type()); // 创建单位矩阵
Mat dstOther4 = Mat:: zeros(2, 2, CV_8UC1);
创建一个空白图像并进行赋值
- 创建一个空白图像,并进行赋值, 方法如下:
// 8. 创建空白图像并进行赋值
Mat emptyImage; // 创建Mat对象
emptyImage.create(src.size(), src.type());
emptyImage = Scalar(0, 0, 255);
-
创建多维数组
// 9. 创建多维数组 int sz[3] = {3, 2, 2}; // 三维矩阵,3x2x2 Mat dstMultiMat(3, sz, CV_8UC1, Scalar::all(0));
表示创建一个三维(\(3\times 2\times 2\))的矩阵,通道数为1,并全部以0填充;
创建小数组
用于创建一些kernel,用于图像的掩模计算:
// 10. 创建小数组
Mat smallMat = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << smallMat << endl;
输出:
[0, -1, 0;
-1, 5, -1;
0, -1, 0]