Day 4 - Opencv 深入了解Mat
1. Mat的初始化操作
	/*
	创建Mat数据结构的几种方式
	*/
	std::string winName = "Image";
	//1.默认初始化
	cv::Mat image1; //大小为0
	//2.指定初始大小
	//  CV_8U表示每个像素对应一个字节,U表示无符号
	//  480 rows,高度  640 cols,宽度
	cv::Mat image2(480, 640, CV_8U, 100);
	
	//3.创建一幅彩色图像
	//  CV_8UC3 表示三通道
	//  Scalar(0, 0, 255) 分别对应BGR,那么创建的图像就为红色
	//  灰度图像可以使用 Scalar(100)
	cv::Mat image3(480, 640, CV_8UC3, cv::Scalar(0, 255, 0));
	//  cv::Size结构包含了矩阵的【高度,宽度】信息,因此也可如下创建
	cv::Mat image4(cv::Size(640, 480), CV_8UC3, cv::Scalar(0, 0, 255));
	//4.用create方法分配或者重新分配图像的数据块
	//  如果图像已被分配,则原先内容会被释放
	//  如果尺寸和类型与原有相同,为了考虑性能,则不会被重新分配内存
	image4.create(cv::Size(640, 480), CV_8UC3);
	//5.赋值
	//对下面图像的任何一幅图像进行改变,都会影响到其他图像,因为都是指向同一片内存区域
	cv::Mat image5(image4);
	image1 = image5;
 
注意事项:
- 当没有指向Mat的引用时,分配的内存就会被自动释放掉,它的实现方法是通过Mat进行引用计数和浅复制
 - 由于只维护了一个引用计数器,所以只有当图像的所有引用都将释放,或者赋值给另一个图像时,内存才会被释放
 - 以下情况图像数据不会被复制,而是指向同一处内存:赋值、图像间的值传递和值返回
 - 在使用类的时候要注意,不要返回图现象的类属性,因为会对图像属性进行浅复制,副本一旦被修改,图像属性也会被偷偷的修改
 
2. Mat数据的深复制
- 下面是Mat文件深复制的一些方法
 - copyTo: 目标图像会调用create方法创建或者重新分配一片内存区域
 - clone:直接生成一幅新的图像
 - 这些图像是原始图像的新副本
 
	cv::Mat image6;
	image5.copyTo(image6);
	cv::Mat image7 = image6.clone();
;
 
- 如果需要将一幅图像复制到另一幅图像中,且两幅图像的数据类型不一定相同,则需使用convertTo()
 
    //转换成浮点型数据[0, 1]
	//保持两幅图像的通道数相同,但不相同也不会报错
	//转换后的像素值的计算公式为 g(x,y) = 1/255.0 * f(x,y) + 0.0 
	image2.convertTo(image7, CV_32F, 1 / 255.0, 0.0);
 
3. Mat小矩阵计算
	//小矩阵计算
	cv::Matx33d matrix1(1, 2, 3, 4, 5, 6, 7, 8, 9);//3*3
	cv::Matx31d matrix2(1, 1, 1);  //3*1  列向量
	cv::Matx31d matrix3 = matrix1 * matrix2;










