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;
}
相关推荐
liu****1 天前
笔试强训(六)
数据结构·c++·算法
「QT(C++)开发工程师」1 天前
C++语言编程规范-并发
java·linux·c++
1白天的黑夜11 天前
递归-21.合并两个有序链表-力扣(LeetCode)
c++·leetcode·链表·递归
adny-code1 天前
[fastgrind] 一个轻量级C++内存监控及可视化开源库
c++·内存·性能分析·高性能计算
郝学胜-神的一滴1 天前
Linux系统函数link、unlink与dentry的关系及使用注意事项
linux·运维·服务器·开发语言·前端·c++
赵杰伦cpp1 天前
list的迭代器
开发语言·数据结构·c++·算法·链表·list
老歌老听老掉牙1 天前
使用 OpenCASCADE 提取布尔运算后平面图形的外轮廓
c++·平面·opencascade
闻缺陷则喜何志丹1 天前
【动态规划】数位DP的原理、模板(封装类)
c++·算法·动态规划·原理·模板·数位dp
胖咕噜的稞达鸭1 天前
二叉树搜索树插入,查找,删除,Key/Value二叉搜索树场景应用+源码实现
c语言·数据结构·c++·算法·gitee
进击的大海贼1 天前
QT-C++ 自定义加工统计通用模块
开发语言·c++·qt