浅拷贝:浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。
深拷贝:深拷贝是指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同地方。
copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则是浅拷贝并不申请新的空间否则先申请空间后再进行拷贝.
clone 是完全的深拷贝,在内存中申请新的空间
用法:
Mat img1 =Mat:: ones(1, 5, CV_32F);
Mat img2 = img1; //赋值为浅拷贝
Mat img3 = Mat::zeros(1, 5, CV_32F);
//img3.copyTo(img1); //img1与img2的矩阵头一致则为浅拷贝
img1= img3.clone(); //clone()为深拷贝
cout << img1 << endl;
cout << img2 << endl;
cout << img3 << endl;
图1 clone()深拷贝 图2,矩阵头一样的copyto()浅拷贝
函数原型
Mat clone() const;
void copyTo( OutputArray m ) const;
void copyTo( OutputArray m, InputArray mask) const;
copyTo()有重载
针对图片看下代码:
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
//Mat img1 = Mat::ones(1, 5, CV_32F);
//Mat img2 = img1;
//Mat img3 = Mat::zeros(1, 5, CV_32F);
//img3.copyTo(img1);
////img1= img3.clone();
//cout << img1 << endl;
//cout << img2 << endl;
//cout << img3 << endl;
Mat img1 = imread("*****************\\图6.68 原始图.jpg");
/***************赋值时是浅拷贝****************/
Mat img1 = imread("*********\\图6.68 原始图.jpg");
Mat img2 = img1; //拷贝方式为浅拷贝,两个对象指向同一内存块
imshow("First", img1);
imshow("image2", img2);
if (!img1.data)
{
cout << "error! The image is not built!" << endl;
return -1;
}
flip(img2, img2, 1); //注意应在原地进行镜像变换
imshow("Second", img1);
/*********************深拷贝*********/
//深拷贝是指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同地方
//Mat img2 = img1.clone(); //拷贝方式是深拷贝
//imshow("First", img1);
//if (!img1.data)
//{
// cout << "error! The image is not built!" << endl;
// return -1;
//}
//flip(img2, img2, 1);
//imshow("Second", img1);
waitKey();
return 0;
}
图3 浅拷贝
图4 深拷贝
参考:http://blog.youkuaiyun.com/qq_23968185/article/details/51242686