OpenCV中vector<Mat>数据存储问题

问题:定义数组Mat后,通过指针/取元素对Mat数组数据进行修改,会遇到深浅拷贝问题。

原因是:push_back调用的是Mat的浅拷贝函数来拷贝数据,数据共享。

一、浅拷贝

//注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)

1.Mat定义矩阵,直接矩阵相等:改变其中一个都会改变。

Mat a;

Mat b = a; //a "copy" to b

Mat c(a); //a "copy" to c

2.Mat矩阵 更新,然后再push_back 到容器中

vector<Mat> AA;

Mat aa= Mat::zeros(1,3,CV_64FC1);

// 循环1:

aa.at<double>(0,1)=1;

AA.push_back(aa) ;

// 循环2:

aa.at<double>(0,1)=2;

AA.push_back(aa) ;

则AA0与 AA1是一样的,说明 aa.at<double>(0,1)会覆盖上一次修改的值。

二、深拷贝

//注意:深拷贝

Mat a;

Mat b = a.clone(); //a copy to b

Mat c;

a.copyTo(c); //a copy to c

实例:

复制代码
#include <iostream>
#include <vector>

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
 
int main()
{
    //1.Mat定义矩阵,直接矩阵相等:改变其中一个都会改变。
    Mat a;
    a= Mat::zeros(1,3,CV_64FC1); 
    a.at<double>(0,1)=3;
    cout << "1.Mat a=" << a << endl<<endl;  // 
    
    Mat b = a; //a "copy" to b
    Mat c(a);  //a "copy" to c
    
    b.at<double>(0,1)=4;
    cout << "2.Mat b=" << b << endl<<endl;  // 
    cout << "2.Mat a=" << a << endl<<endl;  // 
    
    c.at<double>(0,1)=5;
    cout << "3.Mat b=" << b << endl<<endl;  // 
    cout << "3.Mat a=" << a << endl<<endl;  //
    cout << "3.Mat c=" << c << endl<<endl;  //    
    
    
    
    //2.Mat矩阵 更新,然后再push_back 到容器中
    vector<Mat> AA;
    Mat aa= Mat::zeros(1,3,CV_64FC1); 
     

    for(int i=0; i<3;i++)
    {
        if (i=0)    // 循环1:
        {
            aa.at<double>(0,1)=1;
        }
        
        if (i=1)    // 循环2:
        {
            aa.at<double>(0,1)=2;
        }
        AA.push_back(aa) ;
    }
    cout << "AA容器大小 AA.size()=" << AA.size(); //直接输出AA的长度 
 
    for(int j=0; j<3;j++)
    {
        cout << "AA[j=]"<<j<< "]: " << AA[j] << endl<<endl;  // 
    }
    // 则AA[0]与 AA[1]是一样的,说明 aa.at<double>(0,1)会覆盖上一次修改的值。
    cout <<endl;
 
    system("pause");
    return 0;
}
相关推荐
云小逸2 分钟前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图5 分钟前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++
(Charon)7 分钟前
【C++】网络缓冲区设计(三):Chain Buffer链式缓冲区、动态扩容与跨节点读写
服务器·c++
软行2 小时前
LeetCode 每日一题 3876. 构造奇偶一致的数组 II
c++·算法·leetcode
繁星蓝雨2 小时前
C++设计原理———重载(extern “C“的由来、顺序依赖、语义依赖、overload、名称修饰符、对象操作、运算符重载、新增运算符、枚举和布尔类型)
c语言·c++·extern c·overload·重载·语义依赖·顺序依赖
handler012 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
(Charon)3 小时前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
码匠许师傅3 小时前
【设计模式精讲】24.观察者模式(Observer)
c++·观察者模式·设计模式·uml
爱吃火鸡面呀3 小时前
OpenCV 人脸检测与识别实战:从静态图像到视频流
人工智能·opencv·计算机视觉
imgsq3 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++·数据可视化