【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

news2024/11/24 18:57:00

cv::Mat数据深拷贝和浅拷贝

  • cv::Mat 拷贝方法
  • 实验测试
    • 1.matA = matSrc
    • 2.matB(matSrc)
    • 3.matC = matSrc.clone()
    • 4.matSrc.copyTo(matD)

很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。

cv::Mat 拷贝方法

假设这里原图数据为matSrc :

copy方法结果
matA = matSrc浅拷贝
matB(matSrc )浅拷贝
matC = matSrc .clone()深拷贝
matSrc .copyTo(matD)深拷贝

实验测试

测试代码,在拷贝后的图片中加入文字或者叠加图片, 对比原图和拷贝的图片看原图是否改变。这里使用opencv窗口嵌入到Qt窗口中显示:

#include "widget.h"
#include "./ui_widget.h"
#include <Windows.h>
#include <opencv2/highgui/highgui_c.h>

Widget::Widget(QWidget* parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    cv::Mat src = cv::imread("C:/Users/003/Desktop/qt6demo/img/20230214134245.png");
#if 1
    cv::Mat matA = src;
    cv::putText(matA, "MatA", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
    //先显示拷贝的图片
    showImage("matA", matA, ui->picLabel2);
#elif 0
    cv::Mat matB(src);
    cv::putText(matB, "MatB", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
    //先显示拷贝的图片
    showImage("matB", matA, ui->picLabel2);
#elif 0
    cv::Mat matC = src.clone();
    cv::putText(matC, "MatC", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
    //先显示拷贝的图片
    showImage("matC", matA, ui->picLabel2);
#else
    cv::Mat matD;
    src.copyTo(matD);
    cv::putText(matD, "MatD", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
    //先显示拷贝的图片
    showImage("matD", matA, ui->picLabel2);
#endif

    //再显示原图看是否改变
    showImage("src", src, ui->picLabel1);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::showImage(std::string name, cv::Mat& mat, QLabel* label)
{
    cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
    cv::imshow(name, mat);

    HWND hwnd = (HWND)cvGetWindowHandle(name.c_str());
    HWND phwnd = GetParent(hwnd);
    SetParent(hwnd, (HWND)label->winId());
    ShowWindow(phwnd, SW_HIDE);

    cv::resizeWindow(name, cv::Size(540, 318));
}

1.matA = matSrc

在这里插入图片描述
测试结果:在拷贝的图片中加入文字后, 原图也发生了改变,所以这是浅拷贝,data并未全部复制一遍而是只赋值了数据的指针

2.matB(matSrc)

在这里插入图片描述
测试结果:在拷贝的图片中加入文字后, 原图也发生了改变,所以这是浅拷贝,data并未全部复制一遍而是只赋值了数据的指针

3.matC = matSrc.clone()

在这里插入图片描述
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍

4.matSrc.copyTo(matD)

在这里插入图片描述
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#(五十六)之线程池

线程池&#xff1a; 线程池是一种多线程的形式&#xff0c;其中的任务被添加到队列中&#xff0c;并在创建线程时自动启动。 ThreadPool类&#xff1a;以下都是静态方法&#xff1a;&#xff08;不需要new的&#xff09; GetAvailableThreads剩余空闲线程数 GetMaxThreads最…

生成token的两种方式

方式一&#xff1a;自定义工具类 手动编写代码&#xff0c;写两个方法&#xff0c;一个生成&#xff0c;一个解析&#xff1b; 第一步&#xff1a;导入依赖 <!--JWT令牌依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjw…

i2c_tool的使用

文章目录 前言一、交叉编译i2c_tool二、板子上使用i2c_tool三、为什么不需要编写驱动也能够访问到对应设备四、命令行使用i2_tool操作AP3216模块五、使用i2c_tool代码操作IIC设备六、相关函数讲解1.open_i2c_dev2.int set_slave_addr 七、具体代码编写总结 前言 本篇文章将带大…

精益生产对制造业真的那么重要吗?

说到底是精益生产值不值得的问题。 重要且可得&#xff0c;那它就值得。国内的很多制造企业之所以对“精益生产”持怀疑甚至否度态度&#xff0c;大都经历过实施过程中的“水土不服”难题。抛砖引玉讲一下&#xff1a; 1、精益生产的最典型案例 1991年&#xff0c;在当时整个…

架构训练营笔记:可扩展设计

可扩展 复杂度模型 业务复杂度&#xff1a;业务固有的复杂度&#xff0c;主要体现为难以理解、难以扩展&#xff0c;例如业务数量多&#xff08;微信&#xff09;、业务流程长&#xff08;支付宝&#xff09;、业务之间关系复杂&#xff08;例如ERP&#xff09;。 质量复杂度…

基于单片机的智能空调系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前水温&#xff0c;定时提醒&#xff0c;水量变化DS18B20检测当前水体温度&#xff1b;水位传感器检测当前水位&#xff1b;继电器驱动加热片进行水温加热&#xff1b;定时提醒喝水&#xff0c;蜂鸣器报警&#x…

「网络编程」应用层协议_ HTTP协议学习及深入理解

「前言」文章内容大致是应用层协议的HTTP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 俗话说&#xff0c;开弓没有回头箭&#xff0c;唯有箭折、箭落、箭中靶子三种结果而已。 ——江晓英《苏东坡&#xf…

开源代码分享(6)—考虑实时市场联动的电力零售商鲁棒定价策略(附matlab代码)

摘要&#xff1a;电力零售商作为连接电力批发市场与零售市场的桥梁&#xff0c;是电力市场化改革中的重要主体&#xff0c;其经营效率直接决定了市场化改革的成败。然而电力零售商在运营过程中面临着用电量需求和价格双重不确定性的市场风险&#xff0c;亟需通过优化市场行为以…

Qt实现画板绘制椭圆

Qt在窗体中绘图在paintEvent函数中进行,使用QPainter类进行窗体绘制 如果只是简单的在paintevent中向画布绘制椭圆,由于实时绘制的许多个椭圆重合在一起,就会出现下面的情况 你可以在每次绘制椭圆之前调用清空画布 myPix->fill(Qt::white);但是又会出现下面的情况,无法…

一篇万字博客带你入门layUI

今日金句 心里种花&#xff0c;人生才不会荒芜 文章目录 一、什么是layui二、layui、easyui与bootstrap的对比2.1 layui和bootstrap对比&#xff08;这两个都属于UI渲染框架&#xff09;2.2 layui和easyui对比 三、layui入门3.1 引入3.2 入门案例&#xff1a;点击弹出框3.3 经…

数学建模———层次分析法及其matlab语法,函数和代码实现

层次分析法思想登场 建模比赛中最基础的模型之一&#xff0c;其主要用于解决评价类问题&#xff08;例如&#xff1a;选择那种方案最好&#xff0c;哪位运动员或者员工表现的更优秀。&#xff09; 评价类问题字眼&#xff1a; 评价的目标是什么&#xff1f;达到这个目标有那…

flutter开发实战-dio文件下载实现

flutter开发实战-dio文件下载实现 在开发中&#xff0c;需要下载文件&#xff0c;这里使用的是dio dio 是一个强大的 Dart HTTP 请求库&#xff0c;支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 一、引入d…

apache下载

Apache VS17 binaries and modules download php下载地址 PHP For Windows: Home windows.php.net - /downloads/releases/archives/ 历史版本下载 php下载 https://windows.php.net/downloads/releases/archives/php-5.6.37-Win32-VC11-x64.zip https://www.apachehaus.com/…

代码随想录day14

这里推荐这三道题先熟悉二叉树的三种遍历方式 144. 二叉树的前序遍历&#xff08;中->左->右) 根左右。前序遍历首先访问根结点然后遍历左子树&#xff0c;最后遍历右子树。在遍历左、右子树时&#xff0c;仍然先访问根节点&#xff0c;然后遍历左子树&#xff0c;最后…

如何在云中实现安全与合规的规模化?亚马逊云科技给出了答案

在亚马逊云科技&#xff0c;为满足客户不断变化的需求&#xff0c;亚马逊云科技持续创新与迭代&#xff0c;设计的服务能帮助客户满足最严格的安全和合规性要求。针对安全相关工作&#xff0c;亚马逊云科技服务团队与Amazon Security Guardians云守护者项目密切配合&#xff0c…

【计算机视觉】80 TB!58.5 亿!世界第一大规模公开图文数据集 LAION-5B 解读

文章目录 一、导读二、数据集背景信息2.1 图文对数据集2.2 图像数据集 三、LAION-5B有什么3.1 子集3.2 开源模型3.3 KNN index/web界面 四、LAION可以做什么任务4.1 图文匹配及多模态预训练4.2 生成任务4.3 分类任务4.4 其他任务 五、总结 一、导读 继去年 LAION-400M 这个史上…

Android Jetpack Compose多平台用于Android和IOS

Android Jetpack Compose多平台用于Android和IOS JetBrains和外部开源贡献者已经努力工作了几年时间来开发Compose Multiplatform&#xff0c;并最近发布了适用于iOS的Alpha版本。自然地&#xff0c;我们对其功能进行了测试&#xff0c;并决定通过使用该框架在iOS上运行我们的…

leetcode47. 全排列 II 回溯剪枝的细节问题

题目描述&#xff1a; 1、思路 作为回溯算法的经典问题&#xff0c;常用的方法是&#xff0c;每次dfs前先判断是否达到临界条件&#xff0c;满足条件则加入结果集并return。通过循环和dfs来构建树&#xff0c;查找出全部满足条件的集合。 例如本题&#xff0c;如1&…

dp动态规划详解下

dp动态规划详解上&#xff1a;https://blog.csdn.net/weixin_73936404/article/details/131527247?spm1001.2014.3001.5501 目录 dp动态规划详解上&#xff1a;https://blog.csdn.net/weixin_73936404/article/details/131527247?spm1001.2014.3001.5501 【案例1】 【题目描…

强度(极限强度、屈服强度)、韧性材料与脆性材料(韧性材料与脆性材料的强度、为什么脆性材料在压缩时比在拉伸时更坚固?)、材料的延展性、韧性、弹性

1.强度 强度&#xff08;Strength&#xff09;是材料可以承受的应力的量度&#xff0c;通常使用极限强度&#xff08;Ultimate strength&#xff09;和屈服强度&#xff08;Yield strength&#xff09;来定义材料的强度-极限。 材料的极限抗拉强度定义为在拉伸试验过程中达到的…