c#机器学习之opencv(2)-Mat基础

news2024/11/29 20:43:26

目录

    • Mat基础
    • Mat本质
    • copyTo与clone

Mat基础

opencv将图像数据存在一个二维矩阵里。
在这里插入图片描述
下面代码复制了一个图像矩阵。

Mat srcPic = new Mat("test1.png", ImreadModes.Color);
Mat aPic = new Mat(srcPic,new OpenCvSharp.Rect(100,120, srcPic.Width-100, srcPic.Height-120));
Mat bPic = aPic;
using (new OpenCvSharp.Window("src image", srcPic))
using (new OpenCvSharp.Window("copy image", aPic))
{
    Cv2.WaitKey();
}

上述所有对象都指向同一个数据矩阵,使用其中任何一个对象进行修改都会影响所有其他对象。实际上,不同的对象只是为相同的底层数据提供不同的访问方法。然而,它们的头部部分是不同的。
上面代码使用区域new OpenCvSharp.Rect(100,120, srcPic.Width-100, srcPic.Height-120)来创建一个不同的矩阵,注意复制操作符只复制头文件和指向大矩阵的指针,而不复制数据本身。

Mat本质

真正有趣的部分是,您可以创建只引用完整数据的一部分的标题。例如,要在图像中创建一个感兴趣的区域(ROI),只需创建一个具有新边界的新标题。
关于Mat您需要知道的第一件事是,您不再需要手动分配它的内存并在不需要它的时候释放它。虽然这样做仍然是有可能的,但大多数OpenCV函数将自动分配其输出数据。如果传递一个已经存在的Mat对象,它已经为矩阵分配了所需的空间,那么这个对象将被重用。换句话说,我们在任何时候都只使用执行任务所需的内存。

Mat基本上是一个包含两个数据部分的类:矩阵头(包含诸如矩阵的大小、用于存储的方法、存储矩阵的地址等信息)和一个指向包含像素值的矩阵的指针(根据所选择的存储方法获取任何维度)。矩阵标题的大小是恒定的,但是矩阵本身的大小可能因图像而异,通常会大几个数量级。

我们不应该忘记我们正在讨论的是图像处理算法,这往往是计算量很大的。
我们最不想做的就是通过对可能较大的图像进行不必要的复制来进一步降低程序的速度。为了解决这个问题,OpenCV使用了一个引用计数系统。
其思想是,每个Mat对象都有自己的头,但是,通过使两个Mat对象的矩阵指针指向相同的地址,可以在两个Mat对象之间共享一个矩阵。
此外,复制操作符只复制头文件和指向大矩阵的指针,而不复制数据本身。

现在你可能会问——如果矩阵本身可能属于多个Mat对象,当它不再需要时,谁负责清理它呢?
简短的回答是:最后一个使用它的对象。这是通过引用计数机制来处理的。每当有人复制Mat对象的头文件时,矩阵的计数器就会增加。每当清理标头时,此计数器将减少。当计数器达到零时,矩阵被释放。

如果要复制数据本本身,需要使用cv::Mat::clone() and cv::Mat::copyTo()

copyTo与clone

copyTo
下面是第一种方式,好理解,直接复制。

void cv::Mat::copyTo 	( 	OutputArray  	m	) 	const

下面是copyTo的第二种重载方式
void cv::Mat::copyTo ( OutputArray m,
InputArray mask
) const
mask mask与源Mat相同大小,是操作掩码,其非零元素指示需要复制哪些矩阵元素。掩码必须是CV_8U类型,可以有一个或多个通道。

clone和copyTo差不多,都是复制数据。

            Mat srcPic = new Mat("test1.png", ImreadModes.Color);
            Mat aPic=new Mat();
            srcPic.CopyTo(aPic);
            Mat bPic = srcPic.Clone();
            bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];
            using (new OpenCvSharp.Window("a image", aPic))
            using (new OpenCvSharp.Window("b image", bPic))
            using (new OpenCvSharp.Window("src image", srcPic))
            {
                Cv2.WaitKey();
            }

下面这一行修改了bPic图像数据。但并没有影响srcPic。
bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];

在这里插入图片描述 下面是没有深度复制的情况

            Mat srcPic = new Mat("test1.png", ImreadModes.Color);
            Mat aPic=new Mat();
            srcPic.CopyTo(aPic);
            Mat bPic = new Mat(srcPic, new OpenCvSharp.Rect(0, 0, srcPic.Width, srcPic.Height));
            bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];
            using (new OpenCvSharp.Window("a image", aPic))
            using (new OpenCvSharp.Window("b image", bPic))
            using (new OpenCvSharp.Window("src image", srcPic))
            {
                Cv2.WaitKey();
            }

在这里插入图片描述

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

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

相关文章

1.8 打好shell基础

一、常用shell命令 1、管道命令 (1)命令格式 (2)案例演示 任务1、查看/etc目录信息前5行信息 执行命令:ll /etc | head -5 任务2、查看/etc/profile文件后5行信息 执行命令:cat /etc/profile | tai…

大数据培训FileInputFormat实现类

FileInputFormat实现类 思考:在运行MapReduce程序时,输入的文件格式包括:基于行的日志文件、 二进制格式文件、数据库表等。那么,针对不同的数据类型,MapReduce是如 何读取这些劣如据的呢? FileInputFormat常见的接口实现类包括:TextInputF…

mapreduce搭建

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 mapreduce搭建一、配置1.创建mapred-site.xml文件2.编辑mapred-site.xml二、打开hadoop0.删除da…

virtio-net 实现机制【一】(图文并茂)

1. 基于virtio的半虚拟化概述 1.1 virtio运行结构 ① virtio表示虚拟化IO,用于实现设备半虚拟化,即虚拟机中运行的操作系统需要加载特殊的驱动(e.g. virtio-net)且虚拟机知道自己是虚拟机 相较于基于完全模拟的全虚拟化&#xf…

PR-视频加介绍背景

每天一个PS/PR小技巧(原理实践) 比如我们有一个展示视频,我们希望在视频一开始时添加一个介绍背景(纯色背景): 点击新建->颜色遮罩: 定义名称,选择颜色,然后就能在工…

Bug: conda环境与jupyter notebook kernel核环境不一致

问题 一般在服务器上进行环境安装的时候有多种方式,比如docker, conda等。conda肯使用起来更加简便,docker更适合服务器部署的时候使用。 本文记录在使用conda时候出现的问题,jupter notebook中的环境不一致导致的。 首先conda创建环境 co…

蓝桥杯嵌入式第二篇配置按键

文章目录前言一、原理图查看二、cubeMX配置三、代码讲解(使用按键控制LED灯的开关)四、HAL_Delay的内部实现五.遗留的问题总结前言 点完灯后接下来我们就开始按键的学习了,这也是很简单的,大家不用担心。 一、原理图查看 可以看到板子上面是有4个按键…

定时任务多线程-springboot

定时任务 在项目开发过程中,经常需要定时任务来帮助我们实现某些业务功能,比如定时生成数据报表、生成对账单、订单超时处理等。Spring Boot提供了内置的Scheduled注解实现定时任务的功能。 步骤 1.修改启动类 在启动类上加上EnableScheduling开启定时…

华为数字化转型之道 方法篇 第五章 视IT为投资,用产品思维管理IT

第五章 视IT为投资,用产品思维管理IT 5.1 数字时代IT系统的重新定位 比较传统信息化和数字化转型下的IT系统特征,我们发现业务环境、IT能力、业务和IT的关系都发生了巨大的变化(见图5-1) 从“管理系统”到“作业平台” 传统信息化下的IT系统往往侧重于信息记录、流程固化…

LeetCode994. 腐烂的橘子(C++中等题)

题目 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格…

因子模型:协方差矩阵

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 因子协方差矩阵(factor covariance matrix)在计算风险的时候很重要。如果一个模型有个因子,那么协方差矩阵的大小就是。对角线元素是每个因子的方差,非…

[附源码]Python计算机毕业设计SSM流浪动物管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用Python来开发安卓程序:(1)BeeWare安卓开发环境的搭建

文章目录1. 前言2. BeeWare简介3. 开发环境搭建注意事项4. 安装BeeWare5. 开发环境搭建5.1 创建项目5.1.1 创建一个新项目5.2 运行项目5.3 打包项目5.3.1 打包为Windows程序5.3.1.1 首先briefcase create安装应用的脚手架5.3.1.2 然后构建应用5.3.1.3 接着,运行构建…

2. JVM内存模型

1. JVM虚拟机内存模型图解 JAVA虚拟机主要由这三部分组成类装载子系统,字节码执行引擎,运行时数据区上一节我们不是学了类的加载吗,那些类加载器许多都是C帮我们做的,那么我们这个类装载子系统就是帮我们把类放入运行时数据区的&a…

[附源码]Python计算机毕业设计SSM浪漫烘焙屋(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

原创|一个统计查询模块基于设计模式的抽象设计

文章目录一、需求背景二、详细设计UML设计包设计三、程序设计1、VideoAdStatCaliberEnum2、LiveDashboardBusiness3、StatHandleDispatcher4、StatCaliberEnum5、StatContext5、AbstractStatHandler6、LoggerService7、AbstractVideoAdStatHandler1、VideoAdStatContext2、Vide…

cpu设计和实现(协处理器cp0)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 除了通用计算器负责控制和计算之外,cpu如果需要正常有序地运行,还需要一定地协处理器来帮助完成对应地工作。在mips下面&am…

Vue实现流程图,借鉴vue-tree-color 实现流程框架技术

Vue实现流程图,借鉴vue-tree-color 实现流程框架技术 文章目录Vue实现流程图,借鉴vue-tree-color 实现流程框架技术借鉴鸣谢演示效果引入依赖添加全局组件的二次封装步骤1 创建组件目录Vuenode.jstree.less使用组件引入使用数据结构案例借鉴鸣谢 实现组…

[附源码]Python计算机毕业设计Django的桌游信息管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

元宇宙产业委调研行杭州站 | 联合西溪谷管委会共商元宇宙赋能实体经济

11月29日下午,由杭州西溪谷建设发展管理委员会和中国移动通信联合会元宇宙产业工作委员会共同举办的“元宇宙赋能实体经济企业家沙龙暨元宇宙产业委调研行杭州站”在西溪谷杭州蚂蚁链产业创新中心召开。20余家元宇宙和区块链企业到场,西溪谷管委会党委书…