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;
}
相关推荐
爱吃生蚝的于勒6 分钟前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
君生我老40 分钟前
C++自写list类
c++
阿猿收手吧!1 小时前
【C++】异步编程:std::async终极指南
开发语言·c++
REDcker1 小时前
gRPC开发者快速入门
服务器·c++·后端·grpc
doupoa1 小时前
内存指针是什么?为什么指针还要有偏移量?
android·c++
Dfreedom.1 小时前
图像直方图完全解析:从原理到实战应用
图像处理·python·opencv·直方图·直方图均衡化
冉佳驹1 小时前
C++ ——— 异常处理的核心机制和智能指针管理
c++·异常捕获·异常继承体与多态·重载抛异常·raii思想·智能指针shared_ptr·weak_ptr指针
C++ 老炮儿的技术栈1 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
yuuki2332332 小时前
【C++】继承
开发语言·c++·windows
梵刹古音2 小时前
【C++】 析构函数
开发语言·c++