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对象常用属性以及方法

  1. 展示以下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

  1. 演示一些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 
  1. 演示一下如何复制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);
  1. .prt访问矩阵元素

获取图像第一行的第一个元素:

// 6. prt的使用
const uchar * firstRowElement = src.ptr<uchar>(0);
printf("First Row Element: %d\n", *firstRowElement);
  1. 其他方法
// 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);

创建一个空白图像并进行赋值

  1. 创建一个空白图像,并进行赋值, 方法如下:
// 8. 创建空白图像并进行赋值
Mat emptyImage; // 创建Mat对象
emptyImage.create(src.size(), src.type());
emptyImage = Scalar(0, 0, 255);
  1. 创建多维数组

    // 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]
posted @ 2021-04-05 18:48  chenzhen0530  阅读(2278)  评论(0编辑  收藏  举报