本篇的代码会用到关于Mat类的相关知识,开篇先对Mat类进行小结,对其中一些内容仔细推敲的理解可以防止debug中很多棘手问题的出现。
OpenCV中Mat类型的相关说明
OpenCV3中Mat类:
1.1 关于Mat类型的说明(信息来源于OpenCV手册):
OpenCV最早在内存中存放图像的方式为"IplImage"的C语言结构体,这将C语言中对于内存管理的缺点带入了进来,即用户需要为开辟和释放内存负责。于是引入C++中类的概念,即内存的自动管理。
“Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。
OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。这意味着这些图像处理算法具有极大的计算量,因此,除非万不得已,不应该拷贝大的图像,因为这会降低程序速度。”
1.2 初始化:
1) Mat image = imread("图像路径”);用于直接读取一幅图像。
2) Mat image(9, 9, CV_8UC3, Scalar(0, 0, 255));这是标准的初始化格式,四个参数分别表示创建矩阵的高(rows)、宽(cols)、数据类型和通道、BGR值。
关于数据类型,很多OpenCV的函数支持的数据深度只有8位和32位,所以使用CV_64F需谨慎,但是vs的编译器又会把float数据自动变成double型。
第四个参数一次设置各通道元素的值,一般rgb图像的数据类型都为8UC3,这边也需要注意:mat存储图像的通道顺序为BGR,所以上面代码第二行表示把这个9*9,3通道图像的R值都设为255,GB都为0。
CV_8U |
8-bit unsigned integers ( 0 ~ 255 ) |
CV_8S |
8-bit signed integers ( -128 ~ 127 ) |
CV_16U |
16-bit unsigned integers ( 0 ~ 65535 ) |
CV_16S |
16-bit signed integers ( -32768 ~ 32767 ) |
CV_32S |
32-bit signed integers ( -2147483648 ~ 2147483647 ) |
CV_32F |
3 |