OpenCV入门之基本知识( 二 )


在CPP文件夹下的.cpp拷贝到工程下 。
在文件中其中help函数可以帮助我们快速了解该示例的用法以及如何运行 。
三、Mat容器
图像是以离散的数字进行存储的,每一个数字代表一个像素 。
Mat类是里用于存储矩阵数据的类型,与int、等相同 。
Mat类用来保存矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据 。Mat类分为矩阵头和指向存储数据的矩阵指针两部分 。
矩阵头中包含矩阵的尺寸、存储方法、地址和引用次数等 。矩阵头的大小是一个常数,不会随着矩阵尺寸大小而改变 。在绝大多数情况下矩阵头大小远小于矩阵中数据量的大小,因此图像复制和传递过程中主要的开销是存放矩阵数据 。为了解决这个问题,在中复制和传递图像时,只是复制了矩阵头和指向存储数据的指针,因此在创建Mat类时可以先创建矩阵头后赋值数据 。

OpenCV入门之基本知识

文章插图
Mat类由矩阵头和数据构成,矩阵头包含理论图像的尺寸、行数、列数、数据类型、通道数和引用次数,数据则存储了图像的信息等 。
//创建Mat类cv::Mat a; //创建一个名为a的矩阵头a = cv::imread(“test.jpg”); //向a中赋值图像数据,矩阵指针指向像素数据cv::Mat b=a; //复制矩阵头,并命名为b
首先创建了一个名为a的矩阵头,之后读入一张图像并将a中的矩阵指针指向该图像的像素数据,最后将a矩阵头中的内容复制到b矩阵头中 。虽然a、b有各自的矩阵头,但是其矩阵指针指向的是同一个矩阵数据,通过任意一个矩阵头修改矩阵中的数据,另一个矩阵头指向的数据也会跟着发生改变 。
但是当删除a变量时,b变量并不会指向一个空数据,只有当两个变量都删除后,才会释放矩阵数据 。因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据 。
Mat类可以存储的数据类型包含、float、uchar、 char以及自定义的模板等 。
cv::Mat_:自定义数据类型
cv::Mat_:
cv::Mat_:float
cv::Mat_:uchar
cv::Mat_: char
//声明一个指定类型的Mat类cv::Mat A = Mat_(3,3);//创建一个3*3的矩阵用于存放double类型数据
由于提出Mat类主要用于存储图像,而像素值的最大值又决定了图像的质量,如果用8位无符号整数去存储16位图像,会造成严重的图像颜色失真或造成数据错误 。而由于不同位数的编译器对数据长度定义不同,为了避免在不同环境下因变量位数长度不同而造成程序执行问题,根据数值变量存储位数长度定义了数据类型,中规定的数据类型如下:
仅有数据类型是不够的,还需要定义图像数据的通道()数,例如灰度图像数据是单通道数据,彩色图像数据是3通道或者4通道数据 。因此针对这个情况,还定义了通道数标识,C1、C2、C3、C4分别表示单通道、双通道、3通道和4通道 。每一种数据类型都存在多个通道的情况,所以将数据类型与通道数表示结合便得到了中对图像数据类型的完整定义,例如表示的就是8位单通道数据,用于表示8位灰度图,而表示的是8位3通道数据,用于表示8位彩色图 。
//通过OpenCV数据类型创建Mat类cv::Mat a(640,480,CV_8UC3) //创建一个640*480的3通道矩阵用于存放彩色图像cv::Mat a(3,3,CV_8UC1) //创建一个3*3的8位无符号整数的单通道矩阵cv::Mat a(3,3,CV_8U) //创建单通道矩阵C1标识可以省略
1.Mat类的创建