OpenCV-C++ Mat对象的使用

摘要:
通过构造函数定义Mat对象;dst);使用构造函数定义Mat对象的第二个示例如下follows://1.通过构造函数//3定义Mat对象Matdst=Mat(大小(512,//填写值)。Mat对象的公共属性introws=dst.rows//4.Mat对象intchannels=dst.channels()的常用方法;printf(“通道:深度:isEmpty:

这一篇文章中主要介绍有关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);

结果如下图所示:

OpenCV-C++ Mat对象的使用第1张

当然,其中构造函数的两个参数也可以来自已有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
", rows, cols, dims);

输出:

rows: 128, cols: 128, dims: 2

需要注意的是,OpenCV中维度dims与通道channels是两个不同概念:

  • 维度dims表示矩阵的维度,如上面示例是(128 imes 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 
", 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
", *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 imes 2 imes 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]

免责声明:文章转载自《OpenCV-C++ Mat对象的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL查询优化的方法 (转载)Pycharm 永久激活 – 无法启动的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(二)Java数组特性总结,你真的了解数组吗?

一、数组的特殊性 (一)数组标识符是一个引用,指向堆中创建的一个真实对象,这个对象(数组)保存了指向保存其他对象的引用。 (二)数组中保存引用类型时保存的是对象引用,基本数据类型数组保存基本数据的值。 (三)数组的length只表示数组能够容纳多少元素,不能保存实际保存的元素个数。 (四)多维数组可以使用Arrays.deepToString()将多维数组...

MongoDB文档操作(5)

添加文档 语法: db.集合名.insert({k1:"v1", k2:"v2"....}) 注意: (1)文档就是键值对,数据类型是BSON格式,支持的值更加丰富。 比如:db.集合名.insert({name:"bashlog", spc:{weight:100, address:"henan"}}) (2)在添加的文档里面,都有一个'_id'的键,...

CSS3:选择器整理,附css的骚操作,实现表单验证、ios切换按钮……

CSS的选择器很多,整理一下,方便熟悉使用。 基础的标签选择器、#id、.class、*通配符选择器这些常见的就不讲了。 主要记录一些不常用的且实用的,更多参考w3school手册 条件选择器: :has 包含指定的元素 :is   指定条件的元素 :not   非指定条件的元素 :where   指定条件的元素 :scope 指定元素作为参考点 :an...

Jordan标准形

一、引入 前面已经指出,一切n阶矩阵A可以分成许多相似类。今要在与A相似的全体矩阵中,找出一个较简单的矩阵来作为相似类的标准形。当然以对角矩阵作为标准形最好,可惜不是每一个矩阵都能与对角矩阵相似。因此,急需引入一种较为简单而且对于一般矩阵都可由相似变换得到。 当矩阵A能相似于某对角矩阵时,该对角矩阵就是A的一个Jordan形。而当矩阵A不能相似于对角矩阵时...

Lodash学习笔记

有多年开发经验的工程师,往往都会有自己的一套工具库,称为utils、helpers等等,这套库一方面是自己的技术积累,另一方面也是对某项技术的扩展,领先于技术规范的制订和实现。 Lodash就是这样的一套工具库,它内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数,其中部分是目前ECMAScript尚未制订的规范,但同时被业界所认可的辅助函数。莫倩...

Python GUI编程(Tkinter)——Label and Button

Tkinter简介 Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter...