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;
}
相关推荐
Hhy_110721 分钟前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
青少儿编程课堂1 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
YSL0701241 小时前
C++基础
开发语言·c++
eggwyw2 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
曦樂~12 小时前
Cpp面筋
c语言·c++
道尔柯南12 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
十二15 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
D e re k ZH17 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
zjxtxdy19 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚20 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法