首先明白一点,cv::Mat是一个矩阵图像类,它的确有两部分组成:
1)矩阵头:包含矩阵的尺寸、存储方法、存储地址等信息和一个指向存储图像中所有像素的矩阵体
2)矩阵体
在一次项目中,我预先声明了一个Mat对象,此时只创建了图像矩阵的信息头部分,并没有创建矩阵体!
后来在要申请矩阵实体的内存时,遇到了两个问题
问题一 使用create创建矩阵实体
使用create方法来创建矩阵实体时,无法对实体中的内容进行初始化,此时默认的位值为1(每一个bit的值都是1),所以每个像素的double值读出来的值为最大值(负值最大值),而我的程序需要在原来的像素值再加上一个值,此时发生溢出,所以,无论我怎么加值,每一个像素的值都是同一个值(负值最大值)不变,程序运行错误
Mat tmp;
tmp.create(3, 3, CV_64FC1);
问题二 使用zeros方法不正确
zeros方法使用方式如下,错误的方法将导致运行出错
Mat tmp;
// 错误的方法
tmp.zeros(3, 3, CV_64FC1); // 会运行出错
// 正确的方法
tmp = cv::Mat::zeros(3, 3, CV_64FC1);