OpenCV = clone()、copyto()的区别及 Mat的浅层拷贝与深层拷贝

1. OpenCV中的clone()和直接赋值(=)都会导致共享数据区,也就是相当于C++的引用(&),使用copy,才会获取新的Mat。及具有相同的type和size的Mat变量,copyTo和直接赋值(=)不会为目标矩阵重新分配内存,而clone总是会为目标矩阵重新分配内存。

     Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区  
    //Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区  
    //Mat image1 = image.clone() ;//完全拷贝,把image中的所有信息拷贝到image1中  
    Mat image1 ;  
    image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)  
Mat mat1 = Mat::ones(1, 5, CV_32F);   // [1,1,1,1,1]
Mat mat2 = mat1;   // mat2与mat1指向同一内存地址
Mat mat3 = Mat::zeros(1, 5, CV_32F);  // [0,0,0,0,0]
mat3.copyTo(mat1); // mat1未被重新分配内存,通过mat1可以改变mat2的内容
cout << mat1 << endl;   // [0,0,0,0,0] 
cout << mat2 << endl;   // [0,0,0,0,0]
Mat mat1 = Mat::ones(1, 5, CV_32F);   // [1,1,1,1,1]
Mat mat2 = mat1;   // mat2与mat1指向同一内存地址
Mat mat3 = Mat::zeros(1, 5, CV_32F);   // [0,0,0,0,0]
mat1 = mat3.clone();   // mat1被重新分配内存,通过mat1不能改变mat2的内容
cout << mat1 << endl;   // [0,0,0,0,0]
cout << mat2 << endl;   // [1,1,1,1,1]

2. clone是把所有的都复制过来,不论你是否设置了ROI、COI等影响,clone都会原封不动的克隆过来。用clone复制后,如果源图像在内存中消失,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变。

3. copyTo是实现图像roi操作的正确方法。

roi=src.clone();	//1
src.copyTo(roi);	//2

对于语句1:不管roi在之前有没有分配内存,clone都会为其分配新内存。如果roi指向某图像img的某个rect,此语句并不能实现对img(rect)的操作,clone分配新内存后,roi不再指向img(rect).

语句2:如果roi在之前未分配内存,copyTo会为其分配新内存,若roi已分配内存,copyTo不再为其分配。

4.对于Mat之间赋值传递,opencv分为两种情况一种是浅层拷贝比如Mat A=imread("x.jpg"); Mat B=A;时候B就是浅层拷贝A,B只拷贝了A的的头部和地址,当B被操作后A也随之改变;第二种既是深层拷贝,例如Mat A=imread("x.jpg"); Mat B=A.clone();这时候B是开辟了新的内存完全的复制了A的内容,操作B不会对A造成影响;
5.参考链接:https://blog.csdn.net/abcvincent/article/details/78571640

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值