参考学习书籍:《OpenCV3编程入门》
环境:OpenCV4.1.1 + VS2019
一.基础图像容器Mat
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等),一个指向存储所有像素值的矩阵(根据所选存储方式不同,矩阵可以是不同维数的)。矩阵头所占内存小,通常是一个常数,而矩阵本身的尺寸很大,∵它存储了所有的像素值。而且图像处理本身就是一个计算量很大的过程,除非万不得已,都不应该进行大图像的复制。
为了解决占用空间大这一问题,OpenCV引入了计数机制:让每个Mat对象都有自己的矩阵头,但可以共同指向一个矩阵(即让矩阵指针指向同一个地址)。
在OpenCV1.0中,还不存在Mat类,在那时,OpenCV是基于C接口实现的。而其中的图像存储格式IplImage*,在退出前没有relase的话,就会造成内存泄漏,使用非常不方便。在C++出现后,有了类的概念,就不用担心这一问题。如Mat类,是有自动的存储管理。在创建对象时,是不会分配内存空间的。
Mat src; //创建Mat类对象 不分配内存空间
src = imread("1.jpg"); //为src开辟内存空间
上面是一种创建Mat类对象以及赋值的方法,第一行仅是创建对象,即创建矩阵头信息;第二行才是为其分配内存。同样也可以使用下面这种方法创建一个对象并初始化。这就是C++类的好处,同样,跟C++一样的面向对象的语言Java也是这样的。
Mat src = imread("1.jpg");
下面是两种方法的结构都是一样的,都是让dst对象指向src对象的矩阵,只是矩阵头(对象名)不一样。
Mat dst(src); //使用拷贝构造函数
Mat dst;
dst = src; //赋值运算符
显示创建Mat对象的七种方法
对于显示创建Mat对象的七种方法,