openCV Mat深拷贝和浅拷贝以及在ROI中用指针输出图像和ROI图像不同

ROI区域图像叠加、复制和缩放 cv::copyTo() ;cv::addWeighted();cv::resize();cv::flip() 阅读详情

关于深拷贝和浅拷贝:

深拷贝和浅拷贝是根据拷贝的变量是否重新分配内存来区分的,当要重新分配内存来存放拷贝的变量时,就是深拷贝,反之如果拷贝不复制数据只创建矩阵头则为浅拷贝。   举个栗子:加如路人甲有一份文件放在储物柜A中,某时刻路人乙想阅览这份文件或者文件中的一部分(ROI),此时路人乙有两种选择:

1 从甲那获知储物柜A的地址并记住(创建矩阵头),根据这个信息去储物柜A阅览(查询数据)以及修改(处理数据),之后再放     回原位置。这样两者同时共享这份文件;

2 从储物柜A中拿出文件,在复印机中复印一份,源文件依旧在储物柜A中,新复印出来的文件则放在储物柜B中,这样路人乙以后再操作文件就在自己的文件中进行。

在openCV感兴趣区域ROI中,Mat roi = src(rect(x,y,width,height));可以取目标图像的一块作为感兴趣区域,当正常显示时候没问题,但当需要对图像进行处理时则容易出现问题。

uchar* p = roi.ptr<ucahr>(0);通过指针指向roi的起始地址,

for(int i=0;i<roi.rows;++i){

       for(int j=0;j<roi.cols;++j){

               //cout<<int(*(p+i*roi.cols+j));//针对普通Mat

               int(*(p+i*roi.cols+j))==0?printf("0"):printf("1");//方便显示用一张二值化图片

         }

cout<<endl;

}

通过这两张图可以看到,roi输出尺寸和预想一样,输出显示也正常,当时通过指针打印出来后发现数据不对。

这是因为,在程序中 = 赋值是浅拷贝的形式,也就是说roi在生成时只生成了相关的矩阵头,获取了对应图像的地址,其自身并没有对应的数据。在显示中可以正常显示,但当用指针操作时,指针实际指向的是原图像src的roi部分的最开始的那个地址。所以指针操作实际上是在src上操作,ij对应的roi行和列在这里并没有意义,因为这里指针寻迹为src的行和列。也就是说当用指针操作roi时他操作的范围并不是roi而是src在当前地址以后的范围。解决这个问题只需要将roi区域进行clone()或者copyto()深拷贝即可解决。

 

OpenCV入门4:ROI区域操作 上述示例代码展示了如何设置ROI区域、复制和粘贴ROI、进行ROI区域的操作和计算。通过cv::Rect类型的矩形来定义ROI区域的位置和大小,然后使用cv::Mat的成员函数cv::Mat::operator()(const cv::Rect&)来设置ROI。所有的图像操作和计算都可以在ROI区域内进行,例如通过cv::Mat的成员函数cv::Mat::setTo()将ROI区域像素设置为指定的值。可以使用cv::Mat的成员函数cv::Mat::copyTo()来实现ROI区域的复制和粘贴。 阅读详情

相关推荐

OpenCV 深拷贝与浅拷贝:Mat 背后的数据共享机制

OpenCV中Mat对象的深拷贝与浅拷贝机制解析:Mat类由头部(存储元信息)和数据指针组成。浅拷贝(如赋值或拷贝构造)只复制头部,共享数据内存,修改任一对象会影响所有共享对象;深拷贝(如clone()或copyTo())会复制完整数据,生成独立对象。ROI操作本质也是浅拷贝。函数参数默认传递浅拷贝,需注意修改影响。引用计数机制自动管理内存释放。实际开发中应根据需求选择:需要独立操作时用深拷贝,仅读取时用浅拷贝以提升性能,注意ROI连续性问题。合理运用两种拷贝方式能有效避免数据共享导致的bug并优化性能。

Hss891213的博客 135

【C++ OpenCV】感兴趣区域截取(RIO)和图像深拷贝和浅拷贝

创建Mat类时,除了图片数据本身,还创建了一个矩阵头,里面存放了一些图像信息,如下图:每当你创建一个矩阵对象并将其赋值给其他变量时,引用计数会增加。当你销毁或重新分配矩阵对象时,引用计数会减少。引用计数的主要目的是在确保内存安全的同时,实现高效的内存管理。当你将一个矩阵对象赋值给另一个变量时,新的变量会共享相同的矩阵数据,引用计数会增加。这意味着你可以使用多个变量来访问和操作相同的矩阵,而不需要进行显式的数据复制。当引用计数为零时,表示没有任何变量引用矩阵数据,该数据将被释放,内存将被回收。

dagengen12138的博客 1837

opencv基础篇 ——(四)cv::Mat 常用功能介绍

cv::Mat是 OpenCV 库中用于表示图像和多维数组的核心数据结构。它是 OpenCV 中进行图像处理、计算机视觉算法操作的基础。以下是对cv::Matcv::Mat支持的数据类型涵盖 OpenCV 定义的各种基本类型,如CV_8U(无符号 8 位整型)、CV_16S(带符号 16 位整型)、CV_32F(32 位浮点型)等,以及它们的多通道组合(如CV_8UC3表示 3 个 8 位无符号整型通道)。

零落年华的专栏 5644

OpenCV学习笔记(六)——感兴趣区域ROI(浅拷贝与深拷贝的区别)

目录1 浅拷贝2 深拷贝示例代码 有时我们只对一张图像中的部分区域感兴趣,而原图像又比较大,如果带着非感兴趣区域一起处理会占用大量的内存,因次我们希望从原图像中截取部分图像后再进行处理。我们将这个区域称为感兴趣区域(Region Of Interest, ROI),Python中的ROI可以通过NumPy中的索引实现。但是通过索引获取ROI的方式为浅拷贝。下文将分别介绍浅拷贝和深拷贝的方式以及其区别。 1 浅拷贝 ROI = img[x1: x2, y1: y2] 其中各参数的含义如下: ROI:提取的感

a1016249126的博客 7004

C++与OpenCV图像剪切实战:从环境配置到ROI原理详解

图像处理是计算机视觉的基础,其核心在于对像素矩阵的操作。理解图像在内存中的存储结构(如OpenCV的Mat对象)是掌握各类视觉算法的前提。通过定义感兴趣区域(ROI),可以高效地提取或处理图像的特定部分,这一技术在目标检测、人脸识别等任务的数据预处理中至关重要。本文以C++和OpenCV为工具,详细拆解了图像剪切这一基础操作,涵盖了从Visual Studio与vcpkg环境搭建、Mat对象与Rect原理剖析,到实现命令行与交互式剪切工具的完整流程。项目不仅帮助初学者理解像素操作的本质,还深入探讨了ROI的

congsikuai0611的博客 319

OpenCV Mat指针访问:从内存原理到高性能图像处理实战

在计算机视觉和图像处理领域,内存操作是性能优化的核心基础。理解数据在内存中的连续存储原理,是进行高效像素级处理的关键。通过直接操作内存地址,开发者可以绕过高级API的封装开销,实现数量级的性能提升,尤其在处理高清视频流、大尺寸图像或实时算法时至关重要。这种底层访问技术,如OpenCV中的ptr()方法,要求对内存布局、数据类型和字节对齐有清晰认识。其技术价值在于为密集计算、邻域操作和自定义算法提供了最大灵活性。应用场景涵盖图像滤波、特征提取、实时视频分析等。本文聚焦于OpenCV Mat的指针访问机制,深入

weixin_30457551的博客 451

Python-OpenCV选择、提取感兴趣区域(ROI区域)

用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码。

昊虹AI笔记 6379

ERA5气象数据下载与解压全攻略:Python脚本一键搞定(附错误处理技巧)

本文提供了一套完整的ERA5气象数据自动化处理方案,涵盖从CDS API配置、智能批量下载到高效解压与数据验证的全流程。重点介绍了如何通过Python脚本实现一键式数据下载与批量解压,并分享了实用的错误处理技巧与性能优化策略,帮助科研人员高效获取和处理大规模气象数据。

k8l9m0n的博客 338

计算机视觉:OpenCV 图像处理Mat 操作与图形绘制

本文围绕 OpenCV 中 Mat 数据结构及基本图像处理操作展开介绍。首先讲解了 Mat 的深拷贝与浅拷贝,深拷贝会复制头部和数据区,新 Mat 与原 Mat 独立,可用 copyTo () 方法实现;浅拷贝仅复制头部,共享数据区,通过直接赋值等方式实现,修改会相互影响。

weixin_52876322的博客 1735

离线安装vue脚手架,内网安装@vue/cli

公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这里就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta

Liberty_yes的博客 1万+

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 486

OpenCV-----Mat, Mat中插入一行可用push_back与vector类似

Mat是OpenCV中最为重要的属性。Mat的官方解释可以参看OpenCV的help文档。以下是Mat中一些重要的性质:   1.浅拷贝和深拷贝 OpenCV is an image processing library. It contains a large collection of image processing functions. To solve a computationa...

wwwsssZheRen的博客 7009

强化学习算法案例——一个经典的走迷宫任务。

作者:禅与计算机程序设计艺术 1.简介 在强化学习(Reinforcement Learning, RL)中,有一个经典的任务——走迷宫,其原理简单易懂,但它的实际意义却深远,它让计算机学习如何通过策略网络(policy network),以最佳的方式解决复杂的任务。本文将介绍如何用强化学习解决这个经典

AI天才研究院 3217

OpenCV4 学习指导1 —— Mat:最基本的图像容器

Mat 的基本结构和基本用法

DAOCHI 2032

基于知识图谱的智能工作流引擎

随着大数据和人工智能技术的快速发展,企业和组织对数据的依赖程度日益增加。为了更好地管理和利用这些数据,知识图谱逐渐成为一种重要的工具。知识图谱不仅能够以结构化的方式表示复杂的知识,而且能够通过推理和查询提供深层次的信息。然而,如何将知识图谱应用于实际业务场景中,尤其是如何构建智能工作流引擎,仍然是一个具有挑战性的问题。智能工作流引擎是一种能够自动化执行复杂业务流程的系统,它可以通过对业务规则和数据的分析,自动生成和优化工作流,从而提高工作效率和准确性。

AI天才研究院 1871

大数据NiFi(十一):NiFi入门案例一

注意:数据写出的目录可以不需要提前在对应节点上创建,默认是可以自动创建,可以通过“Create Missing Directories”属性配置。将输出文件的权限设置为此属性的值,格式必须是UNIX rwxrwxrwx,用-来代替被拒绝的权限(例如rw-r--r--)或八进制数字(例如644),可以使用表达式,例如${file.permissions}。这里需要使用到的处理器是“GetFile”和“PutFile”,完成以上需求对“GetFile”和“PutFile”相关属性进行配置。

Lansonli(蓝深李)的博客 1490

【秣厉科技】LabVIEW工具包——OpenCV 教程(1):Mat 类的基本用法

Mat即矩阵Matrix,是OpenCV最重要的核心类,通常作为图像数据的容器。本文将介绍如何在LabVIEW下使用Mat类进行矩阵运算和图像处理。

秣厉科技的博客 2028

orin+96712接GMSL2相机调试经验

orin gmsl camera调试

乐于分享 4456

opencv实战从0到N (1)—— Mat结构及操作

Mat结构及操作 接触opencv很久,感觉学习的不够系统,所以将之前的零碎的笔记整理一下。 opencv是一个开源计算机视觉库,其核心为图像处理。Mat则是一个基础的图像容器,作为一个 c++的对象类,我们在使用是不需要担心的内存管理情况,它由由两个数据部分组成:矩阵头(包含矩阵尺寸, 存储方法,存储地址等信息) 和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可...

AI知识搬运工 1042

BAQ压缩原理

BAQ——Block Adaptive Quantization,块自适应量化,一种数据压缩算法。

2872

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OpenCV入门04-图像基础容器Mat

Mat 是 OpenCV 中最基础的图像容器类,用于存储和操作图像数据。它本质上是一个多维数组(矩阵),主要由两部分组成:矩阵头(包含矩阵的尺寸、存储方法、指针地址等元信息)和指向像素数据的指针(实际存储图像像素值)。Mat 类引入了自动内存管理机制,无需手动分配或释放内存,大多数 OpenCV 函数会自动处理输出数据的分配和释放,以提高效率。Mat 支持引用计数系统:多个 Mat 对象可以共享同一块数据内存,通过引用计数管理。当引用计数降为 0 时,内存才会自动释放。

qq_39476209的博客 731

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【openCV】cv::Mat的创建和赋值,图像像素的读写,算术操作

cv::Mat::zeros 的最后一个参数是 type,它指定了矩阵(或图像)的数据类型和通道数。CV_<位数><数据类型符号>C<通道数>或者针对浮点数:CV_<位数>F<通道数>(F 表示 float 或 double)。类型宏位数数据类型通道数元素取值范围典型用途CV_8UC1810~255灰度图、二值掩膜CV_8UC3830~255(每个通道)彩色图像(BGR 顺序)CV_8UC484带透明通道的图像CV_8SC181-128~127梯度或带符号的8位数据。

2301_80224556的博客 536

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c语言构造mat型数据类型,视觉SLAM——OpenCV之Mat结构详解 数据成员和构造函数 创建Mat方法 遍历Mat方法...

前言OpenCV1时代采用基于C语言接口构建函数库,使用名为IplImage的结构体在内存中存储图像,其问题在于需要用户手动管理内存,如果不手动释放内存会造成内存泄漏。OpenCV2引入面向对象编程思想,加入了一个c 接口,使用Mat类数据结构作为主打,可以实现自动内存管理,且扩展性大大提高。Mat概述对于Mat类,首先要知道的是1)不必手动为其开辟空间;2)不必再在不需要时将空间释放。但手动做还...

weixin_42389113的博客 1170

OpenCV中的图像表示详解:Mat与ndarray

Qt Creator中配置OpenCV 本机配置:win10 64位+VS2017+Qt5.9.1,其中Qt安装过程不再赘述,安装时选上MSVC2017-64(因为我的电脑是64位的且VS版本为2017)。 OpenCV-4.0.1+OpenCV_contrib-4.0.1的编译记录可以看下面这篇文章: OpenCV-4.0.1+OpenCV_contrib-4.0.1+VS2017编译配置记录 ...

Hundreays 2689

C++下OpenCV学习笔记----Mat类数据结构

C++下OpenCV学习笔记 ----Mat类数据结构 文章目录C++下OpenCV学习笔记一.简介 一.简介 attention 1>不必再手动为Mat类开辟空间 2>不必在不需要时立即释放空间 组成 1>矩阵头:包含矩阵尺寸、存储方法、存储地址等信息 2>一个指向存储所有像素值的矩阵的指针。其中,根据所选的存储方法的不同,矩阵可以是不同的维数。 矩阵复制 ...

X_To_Y的博客 1137

OpenCV 笔记(1):图像的读取、显示、创建

Part11. 数字图像的含义OpenCV 中的图像,其实指的是数字图像。在介绍图像这个概念之前,先介绍几个基础的概念:像素(Pixel)是图像的基本单元或者基本元素,亦或者是图像最小的单位。图像中的像素点包含不同的像素值。对于灰白图像而言,像素值是介于0-255之间的值;对于拥有 RGB 3个通道的彩色图像而言,每个通道的像素值为0-255;对于二维黑白图片而言,这些像素点构成了一个二维矩阵;对...

Java与Android技术栈 339
上一篇: 百度绿洲、莱茨狗邀请码
下一篇: 递归执行以及递归在解决跳台阶、变态跳台阶中的运用
Lewispu
博客等级 码龄14年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值