对cv::Mat进行容器push_back的理解

2024-05-25 23:58
文章标签 进行 cv 理解 push 容器 back mat

本文主要是介绍对cv::Mat进行容器push_back的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总所周知,cv::Mat 有两种拷贝方式,深拷贝和浅拷贝。直接a=b是浅拷贝,靠.clone()和copyTo()实现深拷贝。

容器的push_back是拷贝。

那么当我们push_back(cv::Mat)时,是深拷贝还是浅拷贝呢?

可以做一个实验,定义一个全局变量cv::Mat a , 全局变量vector<cv::Mat> buf;

不停更新a的值,发现buf里面都是最新的a的值。说明什么呢?说明**在push_bac Mat时是浅拷贝**

但是如果a是一个局部变量,则buf就是对的。这是由于cv::Mat的释放机制。

cv::Mat类似于智能指针的原理,有一个引用机制,有一个成员变量refcount,会自己根据被引用和释放的次数,自动管理内存。

push_back(cv::Mat) 浅拷贝,分配信息头,共享数据区,refcount++, 这时候局部变量a释放,只是清除本身的信息头和置零数据区指针,refcount--,由于refcount还不为零,共享数据区还不会被清空。

我认为如果生成cv::Mat容器,用局部变量来push_back是非常好的一种方式,即可以完成任务,又不耗时(clone耗时耗资源)。关键是能理解这种引用机制,只有一个引用没释放,这片内存就不会被释放!

需要注意的地方!!!

通过驱动(一般c语言编写)读取图片,一般是通过定义一个cv::Mat,其地址指向内存

cv::Mat gray(400, 640, CV_8UC1, buf->planes[0].start);
camera_put_image(handle, buf); //buf被释放了,即gray对应的内存被释放了

然后我们把gray可以浅拷贝给其他变量,push给buff之类的。按照cv::mat的内存管理机制,这里应该是没有什么问题的,前提啊,前提是buf->planes[0]不能释放,如果释放了,也就是所有cv::mat指向的那边内存被释放,一旦这片内存被使用,就会报错。

如果内存被释放,就不得不通过clone的方式给cv::mat重新申请一片内存。

因此我们一定要溯源,第一个mat的内存是什么样子的。可以用

cout << "img ptr" << gray.ptr<float>() << endl;

把mat对应的地址打出来看,我不知道为什么使用ptr<float>()才可以把地址打印出来。用uchar uint8都是乱码的。uint32_t是可以的。

这篇关于对cv::Mat进行容器push_back的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002981

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque