Core组件由名字就知道是最核心功能的模块:在Core组件中,包含了最基本的数据结构,动态数据结构,画图的一些函数和一些系统函数.下面依次来讲一下这些基本的功能.Core组件是很重要的相当于修楼房的砖块,要把一些基本的概念弄懂.
一:基本数据结构
1.Mat类(最基本的数据结构)
1.概念
1.Mat不仅仅是一个图像容器类,同时也是一个通用的矩阵类.
2.不必再手动为其开辟空间,也不必在不需要的时候立即将他的空间释放
3.Mat是一个类,由两个数据部分组成:
1.矩阵头:矩阵尺寸,存储方法,存储地址等等所有相关信息(矩阵头的尺寸是常数值)
2.指向存储所有像素值数据块的指针.
4.赋值运算符和复制构造函数只会复制信息头和指向数据块指针的值.但是不会完整的复制一个矩阵(为了性能和避免内存溢出考虑).所以有多个对象引用同一个值矩阵,改变其中一个对象有改变其他的对象的可能.
5.使用clone()或者copyTo()来深层复制一幅图像的矩阵.
6.前面已经知道一个矩阵可以被多个Mat对象引用,那么最后一个使用这个矩阵的对象,负责清理矩阵。
2.常用函数
1.构造函数(主要介绍下面这两种)
Mat (int rows, int cols, int type, const Scalar &s)
Rows:行数
Cols:列数
Type:类型 CV_[位数][带符号与否][类型前缀][通道数]
例:CV_8UC3表示使用8位的unsighed char类型.每个像素由三个元素组成的三通道.
类型汇总:
CV_8U (8 bit 无符号整形0~255)
CV_8UC1 (1通道) CV_8UC2 (2通道) CV_8UC3 (3通道) CV_8UC4(4通道)
CV_8S (8 bit有符号整形-128~127)
CV_8SC1 (1通道) CV_8SC2 (2通道) CV_8SC3 (3通道) CV_8SC4 (4通道)
CV_16U (16 bit 无符号整形0~65535)
CV_16UC1 (1通道) CV_16UC2 (2通道) CV_16UC3 (3通道) CV_16UC4 (4通道)
CV_16S (16 bit 有符号整形-32768~32767)
CV_16SC1(1通道) CV_16SC2(2通道) CV_16SC3(3通道) CV_16SC4(4通道)
CV_32S (32 bit 有符号整形-2147483648~2147483647)
CV_32SC1 CV_32SC2 CV_32SC3 CV_32SC4
CV_32F (32 bit 浮点)
CV_32FC1 CV_32FC2 CV_32FC3 CV_32FC4
CV_64F (64 bit 浮点)
CV_64FC1 CV_64FC2 CV_64FC3 CV_64FC4
Scalar:颜色类..具体看下面的Scalar类.
Mat (int ndims, const int *sizes, int type, const Scalar &s)
Ndims:维数.
*size:一个数组,表示相应维数下面的具体数量
Type:和上面一样
Scalar:和上面一样.
2.empty()函数(判断是否Mat是否有元素,或者是否分配了图像数据)
使用方法:Mat对象.empty()
返回一个bool对象.
3.channels()函数
返回一个Mat对象的通道数.
4.create()函数
这个方法不能够为矩阵设置初值,只是在改变尺寸的时候重新为矩阵开辟内存而已.
5.type()函数 返回的是一个int值.返回mat的类型.
3.例子
1.Mat的初始化和输出
我们在这里使用的初始化是标准的Mat()构造函数的方法,输出方法是Python风格的输出(以后也会固定这样的创建和输出风格.)
按照pyton的方式输出矩阵,同时还有一点点红色出现在框里面.这是矩阵的输出方式.
2.Mat的内存管理方式(这个例子非常重要)
代码:
结果及其分析:
1.首先就一整个来说,
因为namewindow()了六个窗口.但是其中有一个”image”窗口变色了.
是因为上面这段代码初始化了一个灰度图(CV_8U)然后在”image”命名的这个窗口显示导致的.
2.按一下回车.
其他都没有变,那个image窗口变小了,而且颜色也变了.
是因为下面这段代码导致的
也就是说.这个时候的image1这个mat对象被重新改变了size和值.
3.按一下回车
其他的没有变,只有“image”这个窗口变了。是下面这段代码改变的。