the difference of copyto() and clone() in opencv

clone :完全拷贝

copyto :只是拷贝数据区

重载运算符()= 操作都属于浅拷贝。clone()copyto()属于深拷贝.
这两者的不同在于,copyto()多了一个mask玩法,即重载函数copyTo(OutputArray m, InputArray mask)

clone

Mat::clone
Creates a full copy of the array and the underlying data.

C++: Mat Mat::clone() const
The method creates a full copy of the array. The original step[] is not taken into account.
So, the array copy is a continuous array occupying total()*elemSize() bytes.

copyTo

Mat::copyTo
Copies the matrix to another one.

C++: void Mat::copyTo(OutputArray m) const
C++: void Mat::copyTo(OutputArray m, InputArray mask) const //sometimes usefull
Parameters:	
m – Destination matrix. If it does not have a proper size or type before the operation, it is reallocated.
mask – Operation mask. Its non-zero elements indicate which matrix elements need to be copied. 
Keep in mind that the mask needs to be of type CV_8U and can have 1 or multiple channels.
The method copies the matrix data to another matrix. Before copying the data, the method invokes

m.create(this->size(), this->type());
so that the destination matrix is reallocated if needed. While m.copyTo(m); 
works flawlessly, the function does not handle the case of a partial overlap between the source and the destination matrices.

When the operation mask is specified, if the Mat::create call shown above reallocates the matrix, 
the newly allocated matrix is initialized with all zeros before copying the data.

example

    //mask to get the new image
    disparites_local_u8.copyTo(disparites_morph_loc_u8,disparites_morph_loc_u8);

parameters:disparites_morph_loc_u8is the mask,disparites_local_u8is the original image,
and the output image is also the disparites_local_u8
disparites_morph_loc_u8 is the binary image,disparites_morph_loc_u8is the gray image.

example

// Mat is basically a class with two data parts: the matrix header and   
//a pointer to the matrix containing the pixel values   
  
#include <iostream>  
#include <highgui.h>  
  
using namespace std ;  
using namespace cv ;  
  
int main()  
{  
    Mat image = imread("1.png" , 0) ;  
      
    //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)  
    for(int h = 0 ; h < image1.rows ; ++ h)  
    {  
        uchar* ptr = image1.ptr(h) ;  
        for(int w = 0 ; w < image1.cols ; ++ w)  
        {  
            ptr[w] = 0 ;  
        }  
    }  
    imshow("image" , image) ;  
    imshow("image1" , image1) ;  
    waitKey() ;  
    return 0 ;  
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值