OpenCV学习笔记一

基于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

前言说明:

OpenCV是一个跨平台的库,使用它我们可以开发实时的计算机视觉应用程序。 它主要集中在图像处理,视频采集和分析,包括人脸检测和物体检测等功能。

作者: 黎浤坚

图像存储容器

Mat类介绍

Mat类基本介绍:

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

创建Mat类

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

​编辑

通道:

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

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

通道数的标识

C1:单通道

C2:双通道

C3:3通道

C4:4通道

​编辑

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

Mat类构造与赋值

Mat类的创建

​编辑

​编辑​编辑

复制、创建子类

​编辑

Mat截取构造

用途:在原图中截图使用

​编辑Mat类的赋值

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

​编辑

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

​编辑

​编辑

​编辑​编辑

Mat 类

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

一、Mat 类的定义

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

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

​编辑

​编辑

二.创建 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

常用的构造函数有:​编辑

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类支持的运算

​编辑

​编辑​编辑

​编辑

​编辑

Mat类元素的读取

 Mat矩阵的常用属性:

Cols:矩阵的列数

Rows:矩阵的行数

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

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

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

Channels():矩阵中的通道数

使用at函数来获取元素

​编辑​编辑

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

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

Mat函数

  • 运算操作类函数

MatOp类中

​编辑

​编辑

  • 设置属性构造操作类

MatExpr

​编辑​编辑

图像的读取与显示

图像读取函数imread

​编辑

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

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

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

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

​编辑

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

​编辑

​编辑

Winname:窗口名称,标识符

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

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

​编辑

创建Mat类

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

​编辑

通道:

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

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

通道数的标识

C1:单通道

C2:双通道

C3:3通道

C4:4通道

​编辑

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

Mat类构造与赋值

Mat类的创建

​编辑

​编辑​编辑

复制、创建子类

​编辑

Mat截取构造

用途:在原图中截图使用

​编辑Mat类的赋值

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

​编辑

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

​编辑

​编辑

​编辑​编辑

Mat 类

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

一、Mat 类的定义

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

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

​编辑

​编辑

二.创建 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

常用的构造函数有:​编辑

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类支持的运算

​编辑

​编辑​编辑

​编辑

​编辑

Mat类元素的读取

 Mat矩阵的常用属性:

Cols:矩阵的列数

Rows:矩阵的行数

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

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

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

Channels():矩阵中的通道数

使用at函数来获取元素

​编辑​编辑

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

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

Mat函数

MatOp类中

​编辑

​编辑

MatExpr

​编辑​编辑

图像的读取与显示

图像读取函数imread

​编辑

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

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

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

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

​编辑

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

​编辑

​编辑

Winname:窗口名称,标识符

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

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

​编辑

图像显示函数imshow

​编辑

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

Mat:要显示的矩阵

  1. 显示图片后,允许用户调整窗口大小
  2. 根据图像大小显示窗口,不允许允许用户调整窗口大小
  3. 创建窗口时会支持OpenGL
  4. 全屏显示窗口

    基于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

    前言说明:

    OpenCV是一个跨平台的库,使用它我们可以开发实时的计算机视觉应用程序。 它主要集中在图像处理,视频采集和分析,包括人脸检测和物体检测等功能。

    作者: 黎浤坚

    图像存储容器

    Mat类介绍

    Mat类基本介绍:

  5. Mat类用于存储矩阵数据,向量、矩阵、灰度、彩色图像等数据
  6. Mat类分为矩阵头和指向存储数据的矩阵指针
  7. 矩阵头包含矩阵的尺寸、存储方法、地址和引用次数,矩阵头的大小是一个常数,不会随着尺寸改变而改变
  8. 运算操作类函数
  9. 设置属性构造操作类
  10. 显示图片后,允许用户调整窗口大小
  11. 根据图像大小显示窗口,不允许允许用户调整窗口大小
  12. 创建窗口时会支持OpenGL
  13. 全屏显示窗口
  14. 调整窗口尺寸以充满窗口
  15. 保持图像的比例
  16. 创建的窗口允许添加工具栏和状态栏
  17. 创建没有工具栏和状态栏的窗口
  18. 调整窗口尺寸以充满窗口
  19. 保持图像的比例
  20. 创建的窗口允许添加工具栏和状态栏
  21. 创建没有工具栏和状态栏的窗口

图像显示函数imshow

​编辑

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

Mat:要显示的矩阵

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LL大个仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值