OpenCV学习笔记一

数据载入、显示与保存

目录

数据载入、显示与保存... 1

前言说明:... 1

图像存储容器... 2

Mat类介绍... 2

Mat类基本介绍:... 2

创建Mat类... 2

通道:... 2

Mat类构造与赋值... 3

Mat类的创建... 3

复制、创建子类... 4

Mat截取构造... 4

二.创建 Mat 对象... 7

图像识别与处理之Opencv——Mat类_Mat类... 8

2、 create()函数创建对象... 10

Mat类支持的运算... 11

Mat类元素的读取... 13

Mat矩阵的常用属性:... 13

使用at函数来获取元素... 14

通过指针来获取Mat的元素值... 14

通过迭代器来获取Mat元素的值... 14

Mat函数... 14

图像的读取与显示... 16

图像读取函数imread. 16

flags详解:... 17

图像窗口函数namedWIndow.. 17

图像显示函数imshow.. 18

前言说明:

最新更新时间:2022年11月4日16:08:18

作者:黎雪途

图像存储容器

Mat类介绍

Mat类基本介绍:

  1. Mat类用于存储矩阵数据,向量、矩阵、灰度、彩色图像等数据
  2. Mat类分为矩阵头和指向存储数据的矩阵指针
  3. 矩阵头包含矩阵的尺寸、存储方法、地址和引用次数,矩阵头的大小是一个常数,不会随着尺寸改变而改变

创建Mat类

读入数据:imread()                  括号内的参数为像素数据地址

OpenCV学习笔记一_第1张图片

通道:

灰度图像数据是单通道数据

彩色桐乡数据是3通道或者是4通道数据

通道数的标识

C1:单通道

C2:双通道

C3:3通道

C4:4通道

OpenCV学习笔记一_第2张图片

Uchar和CV_8U都表示8位无符号整数,但是两者有严格的定义,CV_8U只能定义在Mat类内部方法

Mat类构造与赋值

Mat类的创建

OpenCV学习笔记一_第3张图片

OpenCV学习笔记一_第4张图片

复制、创建子类

OpenCV学习笔记一_第5张图片

Mat截取构造

用途:在原图中截图使用

OpenCV学习笔记一_第6张图片Mat类的赋值

Size(列,行):列在前行在后

OpenCV学习笔记一_第7张图片

Scalar:给矩阵中的每一个像素赋值的参数变量类型

OpenCV学习笔记一_第8张图片

OpenCV学习笔记一_第9张图片OpenCV学习笔记一_第10张图片

Mat 类

早期的 OpenCV 中,使用 IplImage 和 CvMat 数据结构来表示图像。 IplImage和 CvMat 都是 C 语言的结构。 使用这两个结构的问题是内存需要手动管理,开发者必须清楚的知道何时需要申请内存,何时需要释放内存。这个开发者带来了一定的负担,开发者应该将更多精力用于算法设计,因此在新版本的 OpenCV 中引入了 Mat 类。新加入的 Mat 类能够自动管理内存。使用 Mat 类,你不再需要花费大量精力在内存管理上。而且你的代码会变得很简洁,代码行数会变少。但 C++接口唯一的不足是当前一些嵌入式开发系统可能只支持 C 语言,如果你的开发平台支持C++,完全没有必要再用 IplImage 和 CvMat。在新版本的 OpenCV 中,开发者依然可以使用 IplImage 和 CvMat,但是一些新增加的函数只提供了 Mat 接口。

一、Mat 类的定义

如下所示,关键的属性如下方代码所示:

自己也可以在opencv的程序里打开看个究竟。

OpenCV学习笔记一_第11张图片

OpenCV学习笔记一_第12张图片

二.创建 Mat 对象

Mat 是一个非常优秀的图像类,它同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵。 有多种方法创建一个 Mat 对象。

1 构造函数方法

Mat 类提供了一系列构造函数,可以方便的根据需要创建 Mat 对象。 下面是一个使用构造函数创建对象的例子。

Mat M(3,2, CV_8UC3, Scalar(0,0,255));

cout << "M = " << endl << " " << M << endl;

    1.

    2.

第一行代码创建一个行数(高度)为 3,列数(宽度)为 2 的图像,图像元素是 8 位无符号整数类型,且有三个通道。图像的所有像素值被初始化为(0, 0,255)。由于 OpenCV 中默认的颜色顺序为 BGR,因此这是一个全红色的图像。

关于常见颜色的RGB组合及解释,见下图:

图像识别与处理之Opencv——Mat类_Mat类

第二行代码是输出 Mat 类的实例 M 的所有像素值。Mat 重定义了<<操作符,使用这个操作符,可以方便地输出所有像素值,而不需要使用 for 循环逐个像素输出。

该段代码的输出如下图所示:

图像识别与处理之Opencv——Mat类_图像编码_02

常用的构造函数有:OpenCV学习笔记一_第13张图片

Mat::Mat()

无参数构造方法;

Mat::Mat(int rows, int cols, int type)

创建行数为 rows,列数为 col,类型为 type 的图像;

Mat::Mat(Size size, int type)

创建大小为 size,类型为 type 的图像;

Mat::Mat(int rows, int cols, int type, const Scalar& s)25

创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;

Mat::Mat(Size size, int type, const Scalar& s)

创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;

Mat::Mat(const Mat& m)

将 m 赋值给新创建的对象,此处不会对图像数据进行复制, m 和新对象

共用图像数据;

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

创建行数为 rows,列数为 col,类型为 type 的图像,此构造函数不创建图像数据所需内存,而是直接使用 data 所指内存,图像的行步长由 step

指定。

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

创建大小为 size,类型为 type 的图像,此构造函数不创建图像数据所需内存,而是直接使用 data 所指内存,图像的行步长由 step 指定。

Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)

创建的新图像为 m 的一部分,具体的范围由 rowRange 和colRange 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据;

Mat::Mat(const Mat& m, const Rect& roi)

创建的新图像为 m 的一部分,具体的范围 roi 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据。

这些构造函数中,很多都涉及到类型 type。

type可以是 CV_8UC1,CV_16SC1,…,CV_64FC4 等。里面的

8U 表示 8 位无符号整数, 即unsigned

16S 表示 16 位有符号整数, 即signed

64F表示 64 位浮点数(即 float 类型)

C 后面的数表示通道数,

例如 C1 表示一个通道的图像, C4 表示 4 个通道的图像,以此类推。如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:

Mat M(3,2, CV_8UC(5));//创建行数为 3,列数为 2,通道数为 5 的图像。

2、 create()函数创建对象

除了在构造函数中可以创建图像,也可以使用 Mat 类的 create()函数创建图像。如果 create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存。

使用方法如下面例程所示:

Mat M(2,2, CV_8UC3);//构造函数创建图像

M.create(3,2, CV_8UC2);//释放内存重新创建图像26

    1.

    2.

需要注意的时,使用 create()函数无法设置图像像素的初始值。

3.Matlab 风格的创建对象方法

OpenCV 2 中提供了 Matlab 风格的函数,如 zeros(), ones()和 eyes()。这种方法使得代码非常简洁,使用起来也非常方便。使用这些函数需要指定图像的大小和类型。

使用方法如下:

Mat Z = Mat::zeros(2,3, CV_8UC1);//2行3列的8位无符号整型,一通道的0矩阵

cout << "Z = " << endl << " " << Z << endl;

Mat O = Mat::ones(2, 3, CV_32F);

cout << "O = " << endl << " " << O << endl;

Mat E = Mat::eye(2, 3, CV_64F);

cout << "E = " << endl << " " << E << endl;

    1.

    2.

    3.

    4.

    5.

    6.

该代码中,有些 type 参数如 CV_32F 未注明通道数目,这种情况下默认表示单通道。

上面代码的输出结果如下图所示:

Mat类支持的运算

OpenCV学习笔记一_第14张图片

OpenCV学习笔记一_第15张图片OpenCV学习笔记一_第16张图片

OpenCV学习笔记一_第17张图片

OpenCV学习笔记一_第18张图片

Mat类元素的读取

 Mat矩阵的常用属性:

Cols:矩阵的列数

Rows:矩阵的行数

Step:以字节为单位的矩阵有效宽度

ElemSize():每个元素的字节数

Total():矩阵中元素的个数

Channels():矩阵中的通道数

使用at函数来获取元素

OpenCV学习笔记一_第19张图片OpenCV学习笔记一_第20张图片

通过指针来获取Mat的元素值

通过迭代器来获取Mat元素的值

Mat函数

  • 运算操作类函数

MatOp类中

OpenCV学习笔记一_第21张图片

OpenCV学习笔记一_第22张图片

  • 设置属性构造操作类

MatExpr

OpenCV学习笔记一_第23张图片OpenCV学习笔记一_第24张图片

图像的读取与显示

图像读取函数imread

Filename:需要读取的文件名称,包含图像地址,名称和图像文件扩展名

Flags:读取图像形式的标志,默认是彩色图片格式,就是3,4通道的矩阵类型

函数用于读取指定的图像并且返回Mat类型变量,当文件不存在,破损,或者格式不支持的时候,就会读取失败,此时返回一个空矩阵,通过返回矩阵的data属性是否为空或者使用函数empty()是否为真来判断是否读取文件成功,读取失败时data属性返回0,empty()函数返回的是1;

读取图像格式的flags参数形式:

OpenCV学习笔记一_第25张图片

flags详解:

-1:按照图像原样读取,保留alpha通道(第4通道)

0:将图像转化为单通道灰度图图像后读取

1:将图像转化为RGB图像读取(第3通道)

2:保留原图像的16位、32位深度,不声明该参数则转换为8位读取

4:以任何可能的颜色读取图像

8:使用gdal驱动程序加载图像

16:将图像转换为单通道灰度图,尺寸缩小1/2,可以更改最后一位数字实现缩小1/4

17:将图像转换为3通道彩色图像,尺寸缩小1/2,可以更改最后一位数字实现缩小1/4

128:不以EXIF的方向旋转图像

图像窗口函数namedWIndow

OpenCV学习笔记一_第26张图片

Winname:窗口名称,标识符

Flags:窗口属性设置标志,默认是WINDOW_AUTOSIZE

多功能添加属性标志使用   |      隔开,如WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED

OpenCV学习笔记一_第27张图片

  1. 显示图片后,允许用户调整窗口大小
  2. 根据图像大小显示窗口,不允许允许用户调整窗口大小
  3. 创建窗口时会支持OpenGL
  4. 全屏显示窗口
  5. 调整窗口尺寸以充满窗口
  6. 保持图像的比例
  7. 创建的窗口允许添加工具栏和状态栏
  8. 创建没有工具栏和状态栏的窗口

图像显示函数imshow

Winname:要显示的窗口名称,用字符串的形式赋值

Mat:要显示的矩阵

你可能感兴趣的:(图像处理,opencv,学习,计算机视觉)