目录

先看结论

代码演示下

效果什么样


先看结论

今天抽空整理了一下关于OpenCV中Mat这个容器的深浅拷贝问题

什么是深拷贝?什么又是浅拷贝?

  • 深拷贝: 分配新内存的同时拷贝数据!当被赋值的容器被修改时,原始容器数据不会改变。
  • 浅拷贝:仅拷贝数据!当被赋值容器修改时,原始容器数据也会做同样改变。(感觉和C++中引用同理)

而到了OpenCV的Mat时,有几种赋值方式分别为:
1、  b = a.clone();
2、  a.copyTo(b);
3、  b = a;
4、  b(a);

先给结论!先给结论!先给结论!
深拷贝是 b = a.clone(); 和 a.copyTo(b);
浅拷贝是 b = a;和 b(a);

本着实践出真知的目的简单写了下面的测试方法 懒得看的童鞋可以自行散场了..

代码演示下

#include <opencv2/opencv.hpp>int main() {double FONTscale = 1.0;std::string str;cv::Mat src = cv::Mat::zeros(480, 640, CV_8UC1);// b = a.clone();    深拷贝cv::Mat check_clone;check_clone = src.clone();str = "clone";cv::putText(check_clone, str, cv::Point(200, 100), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("check_clone", check_clone);// a.copyTo(b);    深拷贝cv::Mat check_copyTo;src.copyTo(check_copyTo);str = "copyTo";cv::putText(check_copyTo, str, cv::Point(200, 150), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("check_copyTo", check_copyTo);// b = a;    浅拷贝cv::Mat check_equal;check_equal = src;str = "equal";cv::putText(check_equal, str, cv::Point(200, 200), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("check_equal", check_equal);// b(a);    浅拷贝cv::Mat check_brackets(src);str = "brackets";cv::putText(check_brackets, str, cv::Point(200, 250), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("check_brackets", check_brackets);// b(a); c = b;    2次浅拷贝 一样是浅拷贝cv::Mat check_b(src);cv::Mat check_q;check_q = check_b;str = "2222";cv::putText(check_q, str, cv::Point(200, 300), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("check_q", check_q);cv::imshow("src", src);cv::waitKey();// check ROI    浅拷贝cv::Mat img = cv::imread("timg.jpg");cv::Mat img_roi;img_roi = img(cv::Rect(400, 200, 100, 100));str = "girl";cv::putText(img_roi, str, cv::Point(50, 50), cv::FONT_ITALIC, FONTscale, cv::Scalar(255, 0, 0), 2);cv::imshow("img", img);cv::imshow("img_roi", img_roi);cv::waitKey();cv::destroyAllWindows();return 0;
}

效果什么样

效果图:

看完上面代码的童鞋会注意到其中还测试了OpenCV中的ROI(感兴趣区域------就是图像截取),在OpenCV中

ROI它也是浅拷贝!它也是浅拷贝!它也是浅拷贝!

cvtColor 是深拷贝?or重新开辟了新的空间//TBD

int main()
{std::string imgFile ="./1.jpg";Mat imRGB = imread(imgFile, cv::IMREAD_UNCHANGED);Mat mImGray = imRGB;if(mImGray.channels()==3){std::cout << "(mImGray.channels()==3" << std::endl;cvtColor(mImGray, mImGray, CV_RGB2GRAY);}//    std::string str = "clone";
//    cv::putText(mImGray,str,cv::Point(200,100),cv::FONT_ITALIC, 1, cv::Scalar(255,0,0),2);imshow("imRGB", imRGB);imshow("mImGray", mImGray);waitKey();return 0;
}//试验结果: imRGB还是彩色图像,没有发生变换, mImGray变成了灰度图像

结束!

OpenCV_cv::Mat的深拷贝 浅拷贝问题相关推荐

  1. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  2. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...

  3. 原型模式与深拷贝浅拷贝

    原型模式与深拷贝浅拷贝 原型模式 Java中的原型模式 简单的例子 浅拷贝 深拷贝 效率比较 JMH测试样例 测试结果 原型模式 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或 ...

  4. 关于opencv中Mat赋值(浅拷贝,深拷贝)原理

    问题点: 有两个垫对象:mat_1和mat_2将mat_2赋值给mat_1(mat_1 = mat_2)后,改变mat_1,mat_2也会被改变(这里的改变是指图像处理). 原因: mat_1 = m ...

  5. Map的putAll方法踩坑实记(对象深拷贝浅拷贝)

    文章目录 问题描述 编写测试代码模拟问题场景 场景1:Map中不包含对象 场景2:Map中包含对象 什么是对象的浅拷贝深拷贝 如何实现深拷贝 问题描述 在一个产品管理系统中,产品信息需要封装一份同步业 ...

  6. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  7. JavaScript学习笔记(五)--深拷贝浅拷贝

    如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 本篇文章中也会简单阐述到栈堆, ...

  8. C++析构函数与构造函数深拷贝浅拷贝(C++初学面向对象编程)

    文章目录 一.析构函数 二.C++默认生成的函数 三.构造与析构的调用顺序 四.构造函数的浅拷贝 五.构造函数的深拷贝 一.析构函数 1.析构函数的作用 对象消亡时,自动被调用,用来释放对象占用的内存 ...

  9. 浅谈C#深拷贝,浅拷贝

    1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个"一模一样"的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制 ...

  10. 真深复制python_Python深复制浅复制or深拷贝浅拷贝

    简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >>> ...

最新文章

  1. 黑客暗网叫卖Zoom账号密码,1分钱能买71个,加密大佬教袁征做人,17年前开源软件现在又火了...
  2. 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐
  3. 常用的简单排序之插入排序,冒泡排序,选择排序,希尔排序
  4. 各个行业纷纷瞅准了这块大蛋糕
  5. 麦克劳林展开式_数学家麦克劳林与牛顿的故事
  6. c语言上机报告之水仙花数,C语言上机报告之水仙花数..doc
  7. H5中 时间格式NAN-NAN-NAN
  8. linux dhcp 绑定mac地址,●DHCP协议的功能是 (58) 。在Linux中提供DHCP服务的程序是 (59) ;DHCP服务将主机的MAC地址和IP地 - 赏学吧...
  9. android 界面布局
  10. 官方jdk历史版本的下载方式
  11. 云计算就业前景究竟怎样 如何加入云计算行列
  12. 微信小程序前端设计(超级实用哦)
  13. Android 隐藏虚拟按键
  14. DDSM数据库在windows环境下的转换
  15. QList添加自定义结构体
  16. CAN2.0A 和CAN2.0B
  17. 企业如何搭建呼叫中心?
  18. 硬盘健康状态、温度、通电次数、写入量和序列号检查软件
  19. 使用Scratch制作项目《弹珠游戏》
  20. 乐视腾讯深度合作 超级电视26日易迅网首发

热门文章

  1. Leetcode46. Permutations全排列
  2. 【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解
  3. c语言 double float 类型
  4. T-SQL查询进阶—理解SQL Server中的锁
  5. 【ARM-Linux开发】ctrl-xxx的对应的signal含义
  6. [OS] 进程相关知识点
  7. Servlet 生命周期、工作原理(转)
  8. lesson - 1 - IP /DNS /cat !$ /putty 知识扩充
  9. 优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!...
  10. Forms Authentication With Absolute Return URLs