OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成:
		1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以
		   Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并
		   没有给将要存储的图像开辟相应的空间
		2--矩阵头--包含:
			1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸
			2--存储方法------对应---各种Mat的构造函数
			3--存储地址
			4--和一个指向----存储所有像素值的矩阵的----指针
2--因此,当在程序中,传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。
3--OpenCv是一个图像处理库,囊括了大量的图像处理函数,为了解决问题,通常要使用库中的多个函数,因此,在函数中传
   递图像是家常便饭的事情.同时,不要忘了我们正在讨论的是计算量很大的图形处理算法,因此,除非万不得已,我们不应该
   拷贝大的图像,因为这会降低程序的速度
4--为了搞定这个问题,OpenCv使用---引用计数机制,其思路就是让每个Mat对象有自己的信息头,但共享一个矩阵。通过让矩阵
   指针指向同一地址而实现。而拷贝构造函数则只拷贝:
		1--信息头
		2--矩阵指针
	而不拷贝矩阵.
		
/*********************************************************************************************
程序功能:
        Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解
编写环境:
        OpenCv2.4.8+VS2010
地点时间:
        陕西师范大学 2016.4.25
作者信息:
        九月
**********************************************************************************************/
/********************************【头文件.命名空间包含部分】***********************************/
#include
#include
#include


using namespace cv;
using namespace std;


#define MAT_INFO_HEADER_SIZE  "Mat图像容器类信息头所占内存空间的大小----->"
#define WINDOW_SRC_NAME       "【原始图像】"
#define WINDOW_DST_NAME       "【复制构造函数图像】"
#define WINDOW_ASSIGN_NAME    "【赋值图像】"
#define WINDOW_ROI_NAME       "【ROI原图像部分数据】"
#define WINDOW_RANGE_NAME     "【Range指定的图像数据部分】"


/*****************************************【main()函数】**************************************/
int main(int argc,char** argv)
{
	
	/****
	*   在这里需要说明的一点是,C++中类对象的定义和java中对象的定义是有巨大区别的:
	*【1】C++中,当定义一个类的对象时,就为其分配了类的存储空间---说的通俗一点,就是说C++中,当用
	*     一个类去定义一个类对象时,其实就是将类---进行了实例化,产生了一个类的----具体实例   
	*【2】而java中,类对象的定义和类对对象的实例化是分开进行的:
	*    【1】Person lili---类对象的定义---开辟了一个四个字节的空间----lili这个类对象其实相当于
	*         C++中的一个对象指针,此时并没有产生类的---具体实例
	*    【2】Java中只能手动的,用new关键字去实例化一个类的对象,如下所示:
	*         lili=new Person();
	****/


	//【1】只创建了信息头部分
	Mat src,assign;
	//【2】我们在这里测试一下,Mat信息头所占内存空间的大小
	cout<(i,j)[0]=255;//蓝色通道
			dstDeep1.at(i,j)[1]=255;//红色通道
			dstDeep1.at(i,j)[2]=255;//绿色通道
		}
	}
	
	imshow("【原始图像】",src);
	imshow("【经过深复制处理过后的图像】",dstDeep1);
	
	waitKey(0);
}

现在,总结一下,我们需要记住的是:
	1--OpenCv函数中输出图像的内存分配是自动完成的(如果不是特别指定的话)
	2--使用OpenCv的C++接口时,不需要考虑内存释放问题
	3--复制运算符和拷贝构造函数只拷贝---信息头
	4--使用函数clone()或者copyTo()来拷贝一副图像的矩阵

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第1张图片

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第2张图片

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第3张图片

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第4张图片

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第5张图片

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解_第6张图片




你可能感兴趣的:(OpenCv专栏,C/C++)