【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:矩阵表达式:代数和cv::Mat

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

    2024年01月19日
    浏览(27)
  • [OpenCV][C++编程] cv::mat的定义与赋值

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

    2024年02月09日
    浏览(35)
  • 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日
    浏览(40)
  • jni-Android Bitmap与OpenCV cv::Mat互转

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

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

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

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

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

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

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

    2024年04月13日
    浏览(61)
  • java关于深拷贝和浅拷贝的理解

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

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

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

    2024年02月07日
    浏览(36)
  • 【面试刷题】——什么是深拷贝和浅拷贝?

    深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用来描述对象拷贝的两个概念,特别是在涉及对象包含其他对象(如嵌套数据结构、指针等)的情况下。 浅拷贝是一种简单的拷贝操作,它只复制对象的内容,而不会复制对象所包含的其他对象。如果对象包含指针,浅拷贝

    2024年02月11日
    浏览(23)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包