问题:定义数组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 bMat c(a); //a "copy" to cb.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;
}