opencv拷贝图像遇到的问题

原本想将Mat image1中的数据存到IMAGE数组中,用test检查下数组数据是否正确,然后就成这样了,不知道哪里出了问题

img

错误在于:你在 imread 时使用默认方式,当成 3通道的彩色图像读取。而在程序中又将其设置为 2通道的灰度图像。
可以在 imread 时设置 flags=0 读取为灰度图像,就可以解决。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/655486
  • 这篇博客也不错, 你可以看下opencv将Mat读入的图像的像素值打印在控制台上
  • 除此之外, 这篇博客: Opencv Mat数据类型&操作中的 一、概述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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());