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

这篇具有很好参考价值的文章主要介绍了【opencv之cv::Mat数据深拷贝和浅拷贝探讨】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用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)

【opencv之cv::Mat数据深拷贝和浅拷贝探讨】,opencv笔记,opencv,计算机视觉,qt,深拷贝,浅拷贝
测试结果:在拷贝的图片中加入文字后, 原图也发生了改变,所以这是浅拷贝,data并未全部复制一遍而是只赋值了数据的指针

3.matC = matSrc.clone()

【opencv之cv::Mat数据深拷贝和浅拷贝探讨】,opencv笔记,opencv,计算机视觉,qt,深拷贝,浅拷贝
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍

4.matSrc.copyTo(matD)

【opencv之cv::Mat数据深拷贝和浅拷贝探讨】,opencv笔记,opencv,计算机视觉,qt,深拷贝,浅拷贝
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正文章来源地址https://www.toymoban.com/news/detail-548239.html

到了这里,关于【opencv之cv::Mat数据深拷贝和浅拷贝探讨】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [OpenCV][C++编程] cv::mat的定义与赋值

    可以通过在/目录下直接搜索opencv,确定opencv所在的目录: lopencv_core 是opencv的核心, -lopencv_highgui包含读取图像和显示图像的函数 -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。 -lopencv_ml包含机器学习算法

    2024年02月09日
    浏览(47)
  • OpenCV:矩阵表达式:代数和cv::Mat

    OpenCV是一个强大的计算机视觉库,它提供了丰富的功能和工具,用于处理图像数据。在OpenCV中,矩阵是一种核心数据结构,而矩阵表达式则是一种强大的工具,用于在图像处理和计算机视觉任务中对矩阵进行代数运算。本文将深入探讨OpenCV中的矩阵表达式,以及它们与cv::Ma

    2024年01月19日
    浏览(41)
  • OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

    通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。 1.1 cv::Mat转换为unsigned char 数组、un

    2024年02月13日
    浏览(54)
  • jni-Android Bitmap与OpenCV cv::Mat互转

    在封装so库的时候,底层c++代码的实现使用了OpenCV对图片进行操作,而Android中从摄像头中获取到的图片数据类型是Bitmap数据类型的,所以这里就避免不了做数据类型的转换。转换的方案主要有两种, 一种是封装的JNI接口方法直接接收cv::Mat数据类型的参数, 第二种是JNI方法的

    2024年02月01日
    浏览(44)
  • 深拷贝和浅拷贝

    目录 一.Java的Cloneable和clone()方法 1.Object类中的clone() 2.实现Cloneable接口的类 3.通过clone()生成对象的特点 二.深拷贝和浅拷贝 1.浅拷贝 2.深拷贝 3.实现深拷贝的两种方法 1.一种是递归的进行拷贝 2.Json字符串的方式进行深拷贝 以下是Java中Object类中clone()方法,我们可以看到clone()方

    2024年02月01日
    浏览(89)
  • 图解Python深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: 代码的输出为: 下面来分析一下这段代码: 首先,创建了一个名为will的变

    2024年04月13日
    浏览(70)
  • JS的深拷贝和浅拷贝

    ‍本文作者是360奇舞团开发工程师 在讨论深拷贝和浅拷贝之前,先来了解下Js基本数据和引用数据类型的存储问题 基本数据类型:Number String Boolean Undefined Symbol Null 引用类型 :Object,function,Array等 基本数据类型的值存放在栈中,在栈中存放的是对应的值;引用类型对应的值存

    2024年02月09日
    浏览(39)
  • C++中的深拷贝和浅拷贝介绍

    对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 me

    2024年02月07日
    浏览(49)
  • java关于深拷贝和浅拷贝的理解

    一、什么是拷贝 拷贝指的就是将一个对象的所有属性(成员属性)拷贝到一个有着相同类型的对象中去 Java中的数据类型分为基本数据类型和引用数据类型,对于这两种数据类型,在进行赋值、用作方法参数、返回值的时候,会有值传递和地址传递的区别。 二、概要 1.浅拷贝

    2024年02月08日
    浏览(39)
  • 关于深拷贝和浅拷贝你需要了解的内容

    深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在复制对象或数据结构时使用的两种不同的策略,它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。 浅拷贝: 浅拷贝创建一个新对象,并将原始对象的属性值复制到新对象中。 浅拷贝通常是通过复制引用

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包