opencv Mat 基本图像容器

本文介绍OpenCV中的核心图像处理容器Mat。Mat不仅简化了内存管理,还通过引用计数系统提高了图像处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opencv Mat 基本图像容器

目标

我们有多种方式从现实世界中获取数字图像:数码相机,扫描仪,计算机断层扫描和磁共振成像等等。在任何情况下,我们(人类)看到的都是图像。然而,当将其转换为数字设备时,我们记录的是图像中每个点的数值。
在这里插入图片描述
例如在上述图像中,您可以看到汽车的镜像只不过是一个包含像素点所有强度值的矩阵。我们如何获取和存储像素值可能会根据我们的需要而有所不同,但最终,计算机世界内的所有图像可能会被减少到描述矩阵本身的数字矩阵和其他信息。OpenCV是一个计算机视觉库,其主要重点是处理和操纵这些信息。因此,您需要熟悉的第一件事是OpenCV如何存储和处理图像。

Mat

OpenCV自2001年以来一直存在。在那些日子里,库是围绕C接口构建的,并将图像存储在内存中,它们使用了一个称为IplImage的C结构。这是大部分老版本的教程和教材。这样做的问题是它带来了C语言的所有缺点。最大的问题是手动内存管理。它建立在用户负责处理内存分配和释放的假设的基础上。虽然这不是一个较小的程序的问题,但一旦你的代码基础的增长,处理这些代码就更难,而不是专注于解决你的发展目标。

幸运的是C ++来了,并介绍了类的概念,使用户更容易通过自动内存管理(或多或少)。好消息是,C ++与C完全兼容,所以在进行更改时不会出现任何兼容性问题。因此,OpenCV 2.0引入了一个新的C ++界面,它提供了一种新的处理方式,这意味着您不需要调节内存管理,使您的代码简洁(少写,实现更多)。C ++界面的主要缺点是,目前许多嵌入式开发系统只支持C.因此,除非您定位嵌入式平台,否则无需使用旧方法(除非您是一个受虐狂程序员,而且您在问为了麻烦)。

您需要了解Mat的第一件事是,您不再需要手动分配其内存,并在不需要它时立即发布它。在执行此操作仍然是可能的情况下,大多数OpenCV功能将自动分配其输出数据。如果您传递已经存在的Mat对象(已经为矩阵分配了所需的空间),那么这是一个很好的奖励,这将被重用。换句话说,我们在任何时候都使用与我们需要执行任务一样多的内存。

Mat基本上是一个具有两个数据部分的类:矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和指向包含像素值(取决于所选存储方法的任何维度)。矩阵头大小是恒定的,然而矩阵本身的大小可以随着图像的不同而变化,通常会大一个数量级。

OpenCV是一个图像处理库。它包含大量的图像处理功能。为了解决计算挑战,大多数时候你最终会使用库的多个功能。因此,将图像传递给功能是常见的做法。我们不应该忘记,我们正在谈论的图像处理算法,这往往是相当计算重。我们想要做的最后一件事是通过制作不必要的可能的大图像副本进一步降低程序的速度。

为解决这个问题,OpenCV使用引用计数系统。这个想法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会将头和指针复制到大矩阵,而不是数据本身。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值