先贴代码:
Mat m1 = Mat::zeros(4, 4, CV_32FC1);
Mat &m2 = m1;
cout << "m1.size() = " << m1.size() << endl;
cout << "m2.size() = " << m2.size() << endl;
m2 = m2(Range(0,1), Range(0,1));
cout << "m1.size() = " << m1.size() << endl;
cout << "m2.size() = " << m2.size() << endl;
cout << endl;
cout << "m2 original value = " << endl << m2 << endl;
m1.at<float>(0, 0) = 1;
cout << "m2 modified value = " << endl << m2 << endl;
结果:
- Mat 是一个类,由两个数据部分组成: 矩阵头 (包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵的 指针 。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。
- 在Mat A = B 中信息头是
深拷贝
,数据仍然共享,所以:
- B矩阵的size改变不会改变A的size,反之亦然
- B矩阵的数据改变会改变A的数据,反之亦然
- 在浅拷贝下数据已共享下,如果想要A与B的size、存储类型都共享,即矩阵头也要共享,则用 引用
引用代码如下,m2矩阵的数据改变会改变m1的数据
Mat m1 = Mat::zeros(4, 4, CV_32FC1);
Mat &m2 = m1; //引用后,信息头也共享了
cout << "m1.size() = " << m1.size() << endl;
cout << "m2.size() = " << m2.size() << endl;
m2 = m2(Range(0,1), Range(0,1));
cout << "m1.size() = " << m1.size() << endl;
cout << "m2.size() = " << m2.size() << endl;
cout << endl;
cout << "m2 original value = " << endl << m2 << endl;
m1.at<float>(0, 0) = 1;
cout << "m2 modified value = " << endl << m2 << endl;
结果: