问题:定义数组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;
}