OpenCV_cv::Mat的深拷贝 浅拷贝问题
目录
先看结论
代码演示下
效果什么样
先看结论
今天抽空整理了一下关于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的深拷贝 浅拷贝问题相关推荐
- java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化
一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...
- 原型模式与深拷贝浅拷贝
原型模式与深拷贝浅拷贝 原型模式 Java中的原型模式 简单的例子 浅拷贝 深拷贝 效率比较 JMH测试样例 测试结果 原型模式 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或 ...
- 关于opencv中Mat赋值(浅拷贝,深拷贝)原理
问题点: 有两个垫对象:mat_1和mat_2将mat_2赋值给mat_1(mat_1 = mat_2)后,改变mat_1,mat_2也会被改变(这里的改变是指图像处理). 原因: mat_1 = m ...
- Map的putAll方法踩坑实记(对象深拷贝浅拷贝)
文章目录 问题描述 编写测试代码模拟问题场景 场景1:Map中不包含对象 场景2:Map中包含对象 什么是对象的浅拷贝深拷贝 如何实现深拷贝 问题描述 在一个产品管理系统中,产品信息需要封装一份同步业 ...
- 一篇文章彻底说清JS的深拷贝/浅拷贝
一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...
- JavaScript学习笔记(五)--深拷贝浅拷贝
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 本篇文章中也会简单阐述到栈堆, ...
- C++析构函数与构造函数深拷贝浅拷贝(C++初学面向对象编程)
文章目录 一.析构函数 二.C++默认生成的函数 三.构造与析构的调用顺序 四.构造函数的浅拷贝 五.构造函数的深拷贝 一.析构函数 1.析构函数的作用 对象消亡时,自动被调用,用来释放对象占用的内存 ...
- 浅谈C#深拷贝,浅拷贝
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个"一模一样"的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制 ...
- 真深复制python_Python深复制浅复制or深拷贝浅拷贝
简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >>> ...
最新文章
- 黑客暗网叫卖Zoom账号密码,1分钱能买71个,加密大佬教袁征做人,17年前开源软件现在又火了...
- 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐
- 常用的简单排序之插入排序,冒泡排序,选择排序,希尔排序
- 各个行业纷纷瞅准了这块大蛋糕
- 麦克劳林展开式_数学家麦克劳林与牛顿的故事
- c语言上机报告之水仙花数,C语言上机报告之水仙花数..doc
- H5中 时间格式NAN-NAN-NAN
- linux dhcp 绑定mac地址,●DHCP协议的功能是 (58) 。在Linux中提供DHCP服务的程序是 (59) ;DHCP服务将主机的MAC地址和IP地 - 赏学吧...
- android 界面布局
- 官方jdk历史版本的下载方式
- 云计算就业前景究竟怎样 如何加入云计算行列
- 微信小程序前端设计(超级实用哦)
- Android 隐藏虚拟按键
- DDSM数据库在windows环境下的转换
- QList添加自定义结构体
- CAN2.0A 和CAN2.0B
- 企业如何搭建呼叫中心?
- 硬盘健康状态、温度、通电次数、写入量和序列号检查软件
- 使用Scratch制作项目《弹珠游戏》
- 乐视腾讯深度合作 超级电视26日易迅网首发
热门文章
- Leetcode46. Permutations全排列
- 【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解
- c语言 double float 类型
- T-SQL查询进阶—理解SQL Server中的锁
- 【ARM-Linux开发】ctrl-xxx的对应的signal含义
- [OS] 进程相关知识点
- Servlet 生命周期、工作原理(转)
- lesson - 1 - IP /DNS /cat !$ /putty 知识扩充
- 优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!...
- Forms Authentication With Absolute Return URLs