IpelImage基于c语言。Mat基于c++,不需要手动(1)为其开辟空间(2)空间释放。
Mat是一个类,包括了:(1)矩阵头(包含矩阵大小、存储方法、存储地址等信息),(2)指向存储所有像素的矩阵的指针。矩阵头的尺寸是常数,但矩阵大小会依据图像而变化。
在使用opencv库函数时,函数中的参数(图像)传递非常普遍,引入了计数机制,让每个Mat对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一地址而实现。而拷贝构造函数则 只拷贝信息头和矩阵指针 ,而不拷贝矩阵。
Mat A, C; // 只创建信息头部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存
Mat B(A); // 使用拷贝构造函数
C = A; // 赋值运算符
以上代码中的所有Mat对象最终都指向同一个也是唯一一个数据矩阵。虽然它们的信息头不同,但通过任何一个对象所做的改变也会影响其它对象。
无论什么时候有人拷贝了一个 Mat 对象的信息头,都会增加矩阵的引用次数;反之当一个头被释放之后,这个计数被减一;当计数值为零,矩阵会被清理。