首页 > 代码库 > opencv 浅拷贝与深拷贝迷惑之处

opencv 浅拷贝与深拷贝迷惑之处

关于opencv中的浅拷贝与深拷贝大家众所周知,这里先赘述一下

(1)浅拷贝:  

Mat B;  

B = image  // 第一种方式  

Mat C(image); // 第二种方式

这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即指向一个矩阵。当图像矩阵发生变化时,两者相关联,都会变化。

(2)深拷贝

Mat B,C;  

B = image.clone();       // 第一种方式  

image.copyTo(C); // 第二种方式  

深拷贝是真正的copy了一个新的图像矩阵,此时image,B,C三者相互没有影响

 

但是这里涉及到一个容易迷惑的地方,那就是对一个Mat 对象进行浅拷贝时,对于两者的操作是等同和关联的,但是这些操作仅限于数据块的操作,若是数据头的操作如再次进行浅拷贝,那最开始被拷贝的对象的数据不会发生改变

 

例如:

Mat B;  

B = image 

Mat C =  logo;

B = logo  

这时 image的数据并不会发生变化,因为对于 B = logo   这一操作只涉及到了数据头并没有涉及到数据块,当然两者不会关联变化 。

opencv 浅拷贝与深拷贝迷惑之处