基于OpenCV的基础知识研究
目录
图像识别与处理之Opencv——Mat类_Mat类... 8
OpenCV是一个跨平台的库,使用它我们可以开发实时的计算机视觉应用程序。 它主要集中在图像处理,视频采集和分析,包括人脸检测和物体检测等功能。
作者: 黎浤坚
Mat类介绍
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 对象。
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组合及解释,见下图:
第二行代码是输出 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():矩阵中的通道数
编辑编辑
Mat函数
MatOp类中
编辑
编辑
MatExpr
编辑编辑
编辑
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的方向旋转图像
编辑
编辑
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
编辑
编辑
Winname:要显示的窗口名称,用字符串的形式赋值
Mat:要显示的矩阵
基于OpenCV的基础知识研究
目录
图像识别与处理之Opencv——Mat类_Mat类... 8
前言说明:
OpenCV是一个跨平台的库,使用它我们可以开发实时的计算机视觉应用程序。 它主要集中在图像处理,视频采集和分析,包括人脸检测和物体检测等功能。
作者: 黎浤坚
图像存储容器
Mat类介绍
Mat类基本介绍:
图像显示函数imshow
编辑
Winname:要显示的窗口名称,用字符串的形式赋值
Mat:要显示的矩阵
文章浏览阅读287次。视频学习网址:https://www.bilibili.com/video/av18210293/?p=39画一个茶壶:点击镜像按钮:选择以y轴镜像、选择复制:即可。_max9镜像插件
文章浏览阅读5.7k次。然后在r.layout**右击就可以生成了。也解决了,右击布局不能一键生成的问题。_butterknife 快速生成
文章浏览阅读6.4k次。第七部分 让 学习率 和 学习势 随着时间改变,让模型训练的更快。第八部分,dropout技巧用作正则化,让模型取得更优的泛化能力。_cnn预测关键角点
文章浏览阅读472次。今天我们来学=学习一下set如何实现去重的相关内容。ES6中新增了set数据结构,类似于数组,其构造函数可以接受一个数组作为参数,我们先来看一下代码:<script> let array = [1, 1, 1, 2, 2, 2, 3, 3, 4]; let set = new Set(array); console.log(set);&..._set函数去重
文章浏览阅读1w次,点赞7次,收藏75次。Hamilton回路问题求解本文分别以最近邻点法和最近插入法求解TSP问题中的Hamilton回路问题。用以下例题作为求解案例V1V2V3V4V5V6V101068715V21005201516V36501478V4820140412V57157406V6151681260最近邻点法最近邻点法的主要逻辑是通过寻找离当前顶点最近的顶点来寻找回来,这样的计算方式比较简便_最近插入法
文章浏览阅读5.9k次,点赞3次,收藏17次。场景: 去重.环境: Oracle Database 11g; PL/SQL Developer1.去重 思路:ROW_NUMBER() OVER(PARTITION BY 需要去重字段 ORDER BY 选择排序字段 DESC) 为指定的去重字段,标上行号,如果有重复的,选中行号为1的就可以.SELECT * FROM (SELECT..._row_number() over partition by去重
文章浏览阅读2k次。利用Sympy计算多项式方程的判别式_高次方程判别式
文章浏览阅读629次。看了一博客 让我比较汗颜 因为我现在总是遇到问题 就是百度好像已经变成我唯一解决问题的方式了下图摘自一博客链接:https://blog.51cto.com/it3246/1889635看了后有些感悟 与大家共勉下下面开始解释问题命令1:abrt-cli list --since 1558053651可以看到引起这个问题的原因了意思大概可以看出是..._for more info run abrt
文章浏览阅读6k次。我们在“hadoop学习1--hadoop2.7.3集群环境搭建” “spark学习1--centOS7.2下基于hadoop2.7.3的spark2.0集群环境搭建” 中已经将hadoop、spark的集群环境都搭建起来了,jdk用的是1.7版本的。 1.启动hadoop集群 centOS7服务器3台 master 192.16_spark dataframe输出到hdfs源码
文章浏览阅读9.4k次,点赞33次,收藏107次。基于法向矢量导向的求椭球上两点的最短弧长问题分析求椭球上任意两点间的最短弧长用数学来推算解析解的话十分复杂,因此考虑通过使用计算机来近似求解。问题的难点在于怎样让每一步都是处在最优的状态,以及怎样使每一步的方向都尽量处在该点能够选择的最优方向上。求椭球上两点的最短路,很容易想到用传统的最短路算法如迪杰斯特拉算法或弗洛伊德算法求解,但是在椭球将步长离散化后,构造以及运用邻接矩阵十分复杂,在保证..._椭球面上两点之间的最短距离
文章浏览阅读1.1k次。禁用用户帐户在禁用用户帐户时,将会更改该帐户,以使用户无法再登录到 Identity Manager 或为其分配的资源帐户。请注意,管理员可以从管理员界面中禁用用户帐户,但无法锁定用户帐户。仅当用户超过了 Identity Manager 帐户策略定义的允许的失败登录尝试次数时,才会将帐户锁定。注 –如果分配的资源没有为帐户禁用提供本机支持,但支持密码更改,则可以将 Identity Manage..._oracle 禁用用户
文章浏览阅读972次,点赞2次,收藏13次。我们在项目中可能会遇到修改用户名及密码的需求,为保证一定的完全性,服务端一般会接入短信验证码的功能。_android 验证码输入框