原本想将Mat image1中的数据存到IMAGE数组中,用test检查下数组数据是否正确,然后就成这样了,不知道哪里出了问题
错误在于:你在 imread 时使用默认方式,当成 3通道的彩色图像读取。而在程序中又将其设置为 2通道的灰度图像。
可以在 imread 时设置 flags=0 读取为灰度图像,就可以解决。
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());