OpenCV中的浅拷贝和深拷贝

文章目录

  • 前言
  • 一、浅拷贝
  • 二、深拷贝
  • 三、比较
  • 总结


前言

在数字图像处理中,针对读取到的一张图像,需要反复利用这张图像做各种的变换,以满足我们项目的需求。在这之前,最容易忽略的一点就是图像之间的拷贝问题,其中的浅拷贝和深拷贝不仅影响数据的存储方式,还直接关系到内存管理和数据修改的影响范围。

一、浅拷贝

浅拷贝是指创建一个新的对象,但这个新对象会引用原始对象中的数据(或指向原始数据的指针)。这意味着,如果原始数据发生变化,通过浅拷贝得到的数据也会发生变化,因为它们实际上指向的是同一块内存地址。

在OpenCV中,当使用赋值操作符(=)时,通常执行的是浅拷贝。

二、深拷贝

深拷贝则是创建一个全新的对象,并复制原始对象中的所有数据到新对象中。这样,原始对象和新对象拥有独立的内存地址和数据。因此,对原始对象的修改不会影响到通过深拷贝得到的新对象。

OpenCV的C++接口提供了clone()方法,但在Python中,可以直接使用NumPy的深拷贝机制。

三、比较

此处举一个简单的例子,当我们想在输入的图像中分别实现画矩形和画圆的操作时,首先我们定义两个函数用于绘制矩形和圆:

def draw_rectangle(image, top_left, bottom_right, color, thickness=2):"""在图像上绘制矩形:param image: 要绘制的图像:param top_left: 矩形左上角的坐标 (x, y):param bottom_right: 矩形右下角的坐标 (x, y):param color: 矩形的颜色,格式为 (B, G, R):param thickness: 矩形边框的厚度:return: 绘制了矩形的图像"""cv2.rectangle(image, top_left, bottom_right, color, thickness)return imagedef draw_circle(image, center, radius, color, thickness=2, fill=False):"""在图像上绘制圆:param image: 要绘制的图像:param center: 圆的中心坐标 (x, y):param radius: 圆的半径:param color: 圆的颜色,格式为 (B, G, R):param thickness: 圆边框的厚度,如果fill=True,则此参数将被忽略:param fill: 是否填充圆:return: 绘制了圆的图像"""if fill:cv2.circle(image, center, radius, color, -1)else:cv2.circle(image, center, radius, color, thickness)return image

我们均使用浅拷贝调用函数的时候,得到的结果不管是原图还是绘制之后的图像均被绘制了图像,这与我们的目的相反。

image = cv2.imread('D:/test.png')
# 绘制矩形
rect_img = image
rect_image = draw_rectangle(rect_img, (50, 50), (200, 200), (0, 0, 0), 3)
# 绘制圆
cir_img = image
circle_image = draw_circle(cir_img, (150, 150), 50, (255, 255, 255), 3, False)

在这里插入图片描述

我们均使用深拷贝调用函数的时候,得到的结果互不干扰

image = cv2.imread('D:/test.png')
# 绘制矩形
rect_img = image.copy()
rect_image = draw_rectangle(rect_img, (50, 50), (200, 200), (0, 0, 0), 3)
# 绘制圆
cir_img = image.copy()
circle_image = draw_circle(cir_img, (150, 150), 50, (255, 255, 255), 3, False)

在这里插入图片描述


总结

区分深拷贝和浅拷贝主要是为了理解数据是如何在内存中存储和管理的,以及如何在不同的对象或函数之间安全地传递数据。浅拷贝可能更节省内存(因为它不复制数据),但在某些情况下,如果原始数据被意外修改,可能会导致数据不一致的问题。深拷贝虽然会消耗更多的内存,但它提供了更高的数据安全性和独立性。

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

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

相关文章

解决在window资源管理器的地址栏中输入\\192.168.x.x\sambashare之后显示无法访问,错误代码 0x80070035,找不到网络路径。

一、错误重现 二、解决方法 1、在cmd中输入gpedit.msc gpedit.msc确定 -> 打开本地组策略编辑器 2、启用不安全的来宾登录 计算机配置 -> 管理模板 -> 网络 -> Lanman工作站 -> 右侧双击编辑"启用不安全的来宾登录",把状态改为 “已启…

跨平台开发新纪元:Xcode的多平台应用构建指南

跨平台开发新纪元:Xcode的多平台应用构建指南 在当今的软件开发领域,跨平台开发已成为一种趋势,它允许开发者使用单一代码库来构建在多个操作系统上运行的应用。Xcode,作为苹果公司提供的集成开发环境(IDE&#xff09…

数据结构——查找算法

文章目录 1. 查找算法 2. 顺序查找 2. 二分查找 1. 查找算法 查找算法是用于在数据集中定位特定元素的位置的算法。查找是计算机科学中一项基本操作,几乎在所有应用程序中都需要使用。例如,数据库查询、信息检索、字典查找等都涉及到查找操作。查找算…

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

🔥 个人主页:空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…

Gradle Wrapper 介绍

Gradle Wrapper简介 Gradle Wrapper是Gradle构建工具的一个功能,它允许用户在没有全局安装Gradle的情况下构建项目。Gradle Wrapper通过一个轻量级的脚本(gradlew 或 gradlew.bat)和一个JAR文件(gradle-wrapper.jar)来…

[C++初阶]list类的初步理解

一、标准库的list类 list的底层是一个带哨兵位的双向循环链表结构 对比forward_list的单链表结构,list的迭代器是一个双向迭代器 与vector等顺序结构的容器相比,list在任意位置进行插入删除的效率更好,但是不支持任意位置的随机访问 list是一…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1,找一个文件夹2,制作application替身1,终端方式2,黄金右手方式 3,.app文件放入文件夹4,制作.dmg压缩镜像文件5,安装.dmg 总结 背景 为绕开App Store…

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前,医疗健康直接关系到国计民生,然而,由于医疗水平和资源分布不均,以及信息系统老化等问题,整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量,在医疗领域的广泛…

java后台报错get property [ ID] setter method from class fail

问题重现:在不同用户登录使用功能时,有部分用户出现接口报错,如下 get property [ ID] setter method from class fail 在XXX类中找不到ID属性 问题排查:后端为拼接sql select st_id as id, st_name as name from stud…

在 MyBatis-Plus 中,字段更新为 null 的方法

在 MyBatis-Plus 中&#xff0c;BaseMapper#updateById 方法默认情况下不会更新为 null 的字段。要更新为 null&#xff0c;需要进行一些配置&#xff0c;或者自定义update方法。 这里记录一下使用BaseMapper中UpdateWrapper进行null值更新。 UpdateWrapper<ErpProductSupp…

Docker部署gitlab私有仓库后查看root默认密码以及修改external_url路径和端口的方法

文章目录 1、docker部署最新版gitlab2、进入gitlab容器3、修改路径地址ip和端口4、检验效果 1、docker部署最新版gitlab #docker安装命令 docker run --detach \--name gitlab \--restart always \-p 1080:80 \-p 10443:443 \-p 1022:22 \-v /gitlab/config:/etc/gitlab \-v …

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 &#xff1a; 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统&#xff0c;发现Packages的演示选项卡无法显示&#xff0c;我尝试从新安转了Packages 也是没作用&#xff0c;…

Redis数据结构详解:String、List、Set、Hash和Sorted Set

Redis 是一个高性能的开源内存数据库&#xff0c;以其简单易用和丰富的数据结构而广受欢迎。在这篇文章中&#xff0c;我们将详细介绍 Redis 中五种常用的数据结构&#xff1a;String、List、Set、Hash 和 Sorted Set。每种数据结构都有其独特的特点和适用场景&#xff0c;我们…

82.Jdk1.8中‌Collectors.joining()

1.Collectors.joining()的作用 在Java Stream API中&#xff0c;‌Collectors.joining()方法用于将流中的元素连接成一个字符串。‌这个方法接受一个可选的前缀和一个后缀作为参数&#xff0c;‌以及一个分隔符&#xff0c;‌用于连接流中的各个元素。‌通过这种方式&#xff0…

夏令营入门组day1

一. 题目 二. 初步思路 因为是解决区间上的问题&#xff0c;很容易想到用前缀和来解决。前缀和是o ( n ) 的时间复杂度&#xff0c;但后续枚举两个端点要 o ( n^2 )&#xff0c;对于2e10的数据&#xff0c;超时。 for (int i 1; i < n; i )for (int j i; j <n; j ){if…

转录组和基因芯片GSE数据RAW.tar压缩包下载和多样本整合处理教程

转录组和基因芯片GSE数据集的RAW.tar压缩包下载和多样本整合处理教程 GSEXXX_RAW.tar压缩包手动下载解压 前情回顾 关于OmicsTools根据GSE编号自动下载和提取GEO表达数据 根据GSE编号自动下载和提取GEO表达数据的窗口截图 自动下载和提取整理到结果文件 该模块的分析教程 …

天环公益首发原创开发进度网站 带后台

天环公益计划首发原创开发进度网站 带后台 后台地址是&#xff1a;admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520358 更多资源下载&#xff1a;关注我。

音视频直播的前世今生

音视频直播的前世今生&#xff0c;可以从多个维度来探讨&#xff0c;包括其技术起源、发展历程、行业现状以及未来趋势。 一、技术起源 音视频直播的技术基础可以追溯到19世纪70年代&#xff0c;但真正进入大众视野并广泛应用则是近几十年的事情。音频的起源一般被认为是从18…

区分modbus tcp和tcp/ip

Modbus 对某些人来说&#xff0c;这听起来可能很复杂&#xff0c;也很令人费解&#xff0c;但是一旦你了解了它的工作原理&#xff0c;那就是一个特别简单的过程。MODBUS 这是一种请求和响应协议。MODBUS 主站将发起请求&#xff0c;从站将响应错误或请求信息。这就是 modbus 简…

通俗易懂,幽默诙谐,《IP 核芯志》让逻辑设计思想摆脱枯燥的标签(可下载)

在科技的广袤星空中&#xff0c;数字逻辑设计宛如一颗璀璨的明星&#xff0c;闪耀着智慧与创造的光芒。而在这光芒的深处&#xff0c;IP 核芯则是那关键的能量源泉&#xff0c;驱动着无数创新的浪潮。 《IP 核芯志——数字逻辑设计思想》犹如一座灯塔&#xff0c;照亮了我们在…