编写程序中发现,两个Mat矩阵简单赋值,会出现共享同一块内存空间。通过查阅资料,总结如下:
浅拷贝,指会共享同一块内存空间,改变其中一个变量的值,另一个变量的值也会随之改变。
深拷贝,不会指向同一地址,两个变量的值一样,但是互不影响。
opencv中Mat矩阵赋值中“B=A”属于浅拷贝,”A.copyTo(B)”和“B=A.clone()”属于深拷贝。(A为赋值矩阵,B为被赋值矩阵)
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat Image0=Mat::zeros(3, 3,1);
cout <<"原始矩阵Image0" << endl << Image0<<endl;
Mat Image1= Image0;
Image1 = Image1 + 3;
cout <<"Image0" << endl << Image0 << endl;
cout <<"Image1" << endl << Image1 << endl;
cout << endl;
Image0 = Mat::zeros(3, 3, 1);
Mat Image2;
Image0.copyTo(Image2);
Image2 = Image2 + 3;
cout << "Image0" << endl << Image0 << endl;
cout << "Image2" << endl << Image2 << endl;
cout << endl;
Image0 = Mat::zeros(3, 3, 1);
Mat Image3;
Image3=Image0.clone();
Image3 = Image3 + 3;
cout << "Image0" << endl << Image0 << endl;
cout << "Image3" << endl << Image3 << endl;
waitKey();
system("pause");
}
结果如下:
可以看出,对Image1矩阵改变会影响Image0的值(“B=A”操作),而对Image2、Image3矩阵改变不会影响Image0的值(”A.copyTo(B)”和“B=A.clone()”操作)。
copyTo()和clone()都是深拷贝,但是也有区别,可参考链接:
https://blog.csdn.net/u013806541/article/details/70154719
https://blog.csdn.net/DreamLike_zzg/article/details/79169336
copyTo():当赋值矩阵大小和被赋值矩阵一致时,不会开辟新内存空间;当赋值矩阵大小大于或小于被赋值矩阵时,会开辟新的内存空间,效果等同于clone()。
clone()是完全深拷贝,不管被赋值矩阵大小和赋值矩阵的是否一致,均会开辟一个新的内存空间。
Mat_<int>A(3, 3);
randu(A,Scalar(0), Scalar(255));
cout << "A = " << A << endl << endl;
Mat D = A.col(1);
A.col(0).copyTo(D);
cout << "D = " << D << endl << endl;
cout << "A = " << A << endl << endl;
Mat B(3,3, CV_8UC1, Scalar(0));
B.copyTo(D);
cout << "D = " << D << endl << endl;
cout << "A = " << A << endl << endl;
Mat E= A.col(1);
E=A.col(0).clone();
cout << "E = " << E << endl << endl;
cout << "A = " << A << endl << endl;