一、概述
Mat用来表示图像或稠密数组。
特别注意:数组中的数据不是直接绑定在mat的对象上的。Mat对象实质上是一个数据存储区的头,而非数组本身。如果忽略这点,经常会带来bug。
例如,mat1 = mat2,随后修改mat1或mat2中的一个,另一个随之改变,这是因为mat1和mat2两个对象的矩阵头不同,但共享内存空间。上述拷贝属于浅拷贝。深拷贝需要mat1=mat2.clone()。
再比如:将mat对象放入vector中,
VideoCapture cap("test.avi");
Mat currentframe;
while(true){
cap>>currentframe;
std::vector<cv::Mat> frames;
frames.push_back(currentframe);
if(currentframe.empty())
break;
}
for(auto r& frames){
imshow(r);
}
最后,发现回放出来的视频都是最后一帧。如果想把数组连同mat一起放进vector,实际需要使用深拷贝:
imgs.push_back(img.clone());
二、矩阵元素类型
CV_{8U,8S,16U,16S,32F,32S,64F}C{1,2,3,4}。
各类型信息:
类型 | 占位 | 取值范围 | 与C++等效的变量 |
---|---|---|---|
CV_8U | 8bits | 0~255 | unsigned char |
CV_8S | 8bits | -128~127 | char |
CV_16U | 16bits | 0~65535 | ushort,unsigned short |