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

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 1cv::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 0cv::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 0cv::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);
#elsecv::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.hqwc.cn/news/18781.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCODE 设置同步network Error 问题

前言 这个问题等解决方法如下&#xff1a; 获取到github以及vscode-auth.github.com的ip&#xff0c;添加到host&#xff0c;随后使用命令行刷新host&#xff0c;重新认证即可 第一步&#xff0c;查看log文件&#xff0c; 打开 vscode&#xff0c;使用快捷指令ctrl(command)…

虹科分享 | 如何基于IO-Link wireless方案实现工厂数据采集和状态监测

数据和数字化是工业4.0变革的关键驱动因素。从整个工厂的传感器获取数据&#xff0c;除了优化制造计划和流程外&#xff0c;还能实现强大的分析和决策。目前&#xff0c;基于数据的应用正在催生更多智能解决方案&#xff0c;以提高制造业的灵活性和敏捷性&#xff0c;进而提高效…

B端原型设计太复杂?看这一篇轻松入门

近年来&#xff0c;B端市场前景展现广阔&#xff0c;B端产品经理也成为了炙手可热的高薪岗位。作为负责管理和推动B端产品开发和生命周期的负责人&#xff0c;B端产品经理在企业市场中发挥着重要作用&#xff0c;因此他们往往也是具备全局能力框架的专业人员。 然而&#xff0…

服务端研发提测模板

test环境分支自测通过 提测邮件标注test环境分支 【xxxxxx需求】服务端研发提测了&#xff0c;快去测试吧!

Matplotlib---3D图

1. 3D图 # 3D引擎 from mpl_toolkits.mplot3d.axes3d import Axes3D fig plt.figure(figsize(8, 5)) x np.linspace(0, 100, 400) y np.sin(x) z np.cos(x)# 三维折线图 axes Axes3D(fig, auto_add_to_figureFalse) fig.add_axes(axes) axes.plot(x,y,z) plt.savefi…

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型 用到的区域文件、地图标记文件、路径信息文件、模型文件 提取码&#xff1a;99jq 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium…

AI智能语音机器人的功能和作用都有哪些?

智能语音机器人是一种能够使用自然语言处理技术和人工智能算法&#xff0c;通过声音与用户进行交互的机器人。它可以回答用户提出的问题、处理用户的投诉、提供产品或服务的相关信息等等。 实现一个智能语音机器人需要涉及多个技术领域&#xff0c;包括自然语言处理、语音识别…

CSS 沿着同一个方向旋转

主要解决旋转360后倒转的问题&#xff0c;沿着一个方向旋转&#xff0c;而不是倒回去重新开始。 效果 源码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>同方向旋转</title><script src"https://dp.rc1…

[QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 2. QT程序的运行框架 2.1 Hello World程序框架 上述示例代码中&#xff0c;首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你…

前端框架Layui的使用讲解(Layui搭建登录注册页面)

目录 一、前言 1.什么是Layui 2.Layui的背景 3.为什么要使用Layui 4.Layui的模块化 二、Layui使用讲解 1.初识Layui 2.搭建登录页面 静态效果图​ 封装引入文件页面&#xff08;公用页面&#xff09; jsp页面搭建 userDao编写 Servlet页面编写 xml文件配置 3.搭…

BM68-矩阵的最小路径和

题目 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

GEE:多元线性回归

作者:CSDN @ _养乐多_ 本文记录了在NDVI、EVI和LAI作为自变量,precipitation作为因变量的条件下,使用linearRegression函数进行线性回归分析的代码,代码在Google Earth Engine(GEE)平台上实现。具体而言,该函数可以计算NDVI、EVI和LAI对precipitation的影响关系。通过线…