Mat的一些简单注意点
1.历史
1.早期的OpenCV是以Ipllmage的结构体作为图像的数据格式,需要手动进行内存管理,这时候是基于C的
2.OpenCV2.0后引进了一种新的针对于C++的接口Mat对象,不需要用户手动进行内存管理
2.略解
Mat的数据部分:
矩阵头(包含矩阵大小,用于储存的方法、储存矩阵的地址信息、引用计数等)
指向储存数据的指针
Mat的复制与清理:
Mat这个部分OpenCV采用了参考计数系统:其中每一个Mat对象队友自己的头,包含了图像的基本信息(大小、类型、通道),两个Mat对象都是通过矩阵指针指向同一个地址来共享矩阵,节省储存空间,相互之间复制一般也是复制矩阵头与矩阵指针,图像的数据本身还是共享的。
Mat A,B;
A=cv::imread(_path);
B=A;
Mat C=A;
这里面的几个就是矩阵头不一样,数据都是一样的
当多个对象都同时使用同一个矩阵的时候,是由最后一个使用它的对象进行清理
如果需要保存原数据并且还要更改的时候,这时候就会用clone或者copyTo来进行深拷贝
通道储存方式:
OpenCV的储存方式(BGR)不同于一般的图像储存方式(RGB),这个应该是历史遗留的问题
Mat元素的访问:
1.直接指针访问---性能最好
2.迭代器MatIterator---这种应该更安全一点针对于数据不是连续储存的
3.带引用返回的动态地址计算方式 Mat.at()
4.用自带函数LUT---这个我没有用过