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工作站 -> 右侧双击编辑"启用不安全的来宾登录",把状态改为 “已启…

数据结构——查找算法

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

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

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

[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…

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

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

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新版本 演示选项卡无法显示 问题描述 : 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统,发现Packages的演示选项卡无法显示,我尝试从新安转了Packages 也是没作用,…

夏令营入门组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;关注我。

区分modbus tcp和tcp/ip

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

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

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

Java | Leetcode Java题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (cnt.containsKey(nums[i])) {cnt.…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …

JS爬虫实战之极验四代

极验四代滑块验证码 一、目标网站说明二、流程步骤1. 逆向步骤一般分为&#xff1a;2. 接口确认1- 确认流程2- 获取verify的参数3- 构建requests验证verify的参数4- 锁定secode参数的作用 ok&#xff0c;让我们去获取verify接口中的响应&#xff01;&#xff01;&#xff01; 3…

java算法day12

java算法day12 199二叉树的右视图637二叉树的层平均值515 在每个树行中找最大值429 N叉树的层序遍历116 填充每个节点的下一个右侧节点指针 199 二叉树的右视图 这题还是层序遍历的板子&#xff0c;但是在处理上略有差异 这个题我一开始的想法就有误&#xff0c;因为我一开始…

基于PID控制器的双容控制系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器的基本原理 4.2双容水箱系统的数学模型 5.完整工程文件 1.课题概述 基于PID控制器的双容控制系统matlab仿真&#xff0c;仿真输出PID控制下的水位和流量两个指标。 2.系统仿真结果 &…

Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 SCGI代理scgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this art…

ENSP防火墙

实验拓扑图 需求&#xff1a; ENSP的配置&#xff1a; 防火墙&#xff1a; 交换机&#xff1a; 华为防火墙的配置&#xff1a; 接口配置&#xff1a; 安全区域&#xff1a; 安全策略&#xff1a; 办公区访问DMZ&#xff1a; 生产区访问DMZ&#xff1a; 游客区只能访问门户网…