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) ;

则AA[0]与 AA[1]是一样的,说明 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;
}
相关推荐
挨代码3 小时前
UE_C++ —— Gameplay Modules
c++·ue
攻城狮7号7 小时前
【第四节】C++设计模式(创建型模式)-Builder(建造者)模式
c++·设计模式·建造者模式
fpcc7 小时前
设计心得——解耦的实现技术
c++·软件工程
东方芷兰8 小时前
算法笔记 04 —— 算法初步(下)
c++·笔记·算法
xinghuitunan8 小时前
时间转换(acwing)c/c++/java/python
java·c语言·c++·python
TechNomad8 小时前
C++访问MySQL数据库
数据库·c++·mysql
Emplace9 小时前
ABC381E题解
c++·算法
ctrigger10 小时前
AI回答:Linux C/C++编程学习路线
linux·c语言·c++
h^hh11 小时前
洛谷 P3405 [USACO16DEC] Cities and States S(详解)c++
开发语言·数据结构·c++·算法·哈希算法
Dreams°12311 小时前
【透过 C++ 实现数据结构:链表、数组、树和图蕴含的逻辑深度解析】
开发语言·数据结构·c++·mysql