OpenCV中图像Mat常用的浅拷贝和深拷贝操作和区别传值、传引用、clone()、copyto() 您所在的位置:网站首页 cvmat和mat的区别 OpenCV中图像Mat常用的浅拷贝和深拷贝操作和区别传值、传引用、clone()、copyto()

OpenCV中图像Mat常用的浅拷贝和深拷贝操作和区别传值、传引用、clone()、copyto()

2024-06-12 19:51| 来源: 网络整理| 查看: 265

在OpenCV中,Mat类使用非常广泛,对于Mat容器的拷贝方式将对程序运行效率产生很大的影响,在Mat中效率最高的浅拷贝,效率较低的是深拷贝。

1.什么是深拷贝和浅拷贝?

深拷贝:将数据拷贝到一段新的内存中,源数据和拷贝之后的数据在内存中相互独立,改变任何一个都不影响另外一个。 浅拷贝:浅拷贝只是将要拷贝数据的地址拷贝到一个新的Mat中,源数据和拷贝后的数据同一段内存中的数据,只要对应内存中的数据发生变化,它们的内容都会发生变化。

2.OpenCV中的深拷贝和浅拷贝函数 浅拷贝: Mat A = imread("./image.jpg") Mat B = A;//用A对B初始化,只是将指向A的地址等信息复制给B,A和B共用一段内存 Mat B(A); B = A.rowRange(0, 5);//将指向A中0~5行的必要地址信息,复制给B,A和B共用0~5行的内存 B = A.colRange(0, 5);//将指向A中0~5列的必要地址信息,复制给B,A和B共用0~5列的内存 B = A(Rect(0, 0, 100,100));//将A中Rect(0,0,100,100)区域内的数据的必要地址信息复制给B B = A(Range(1, 100), Range::all()); //对于函数中的传值与引用,也都是浅拷贝,数据的改变也都会影响到源数据 void A(cv::Mat image) void A(cv::Mat& image) 深拷贝: Mat A = imread("./image.jpg"); Mat B = A.clone();//将A中的数据在一个新的内存中复制一份一模一样的给B A.copyTo(B);//将A中的数据在一个新的内存中复制一份一模一样的给B

clone()和copyTo的区别:它们除了对不同的矩阵头文件做不同的内存操作外,最大的区别在于,clone()是复制一整个一模一样的Mat,而copyTo(),可以使用mask选择复制的范围,A.copyTo(B,mask)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有