Mat介绍
OpenCV自2001年开始出现。当时,这个库是围绕一个C接口构建的,并将图像存储在内存中,它们使用了一个名为IplImage的C结构。这是您在大多数旧教程和教学材料中看到的内容。 这个问题是它带来了C语言的所有缺点。最大的问题是手动内存管理。它建立在用户负责处理内存分配和释放的假设之上。虽然这对于较小的程序来说不是问题,但是一旦你的代码库增长,处理所有这些问题将更加困难,而不是专注于解决你的开发目标。
幸运的是,C ++出现并通过自动内存管理(或多或少)引入了类更容易为用户创建的概念。 好消息是C ++与C完全兼容,因此进行更改不会产生兼容性问题。 因此,OpenCV 2.0引入了一种新的C ++接口,它提供了一种新的工作方式,这意味着您不需要操作内存管理,使您的代码更简洁(更少编写,实现更多)。C ++界面的主要缺点是目前许多嵌入式开发系统只支持C.因此,除非你的目标是嵌入式平台,否则使用旧方法是没有意义的。
Mat基本上是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针。 像素值(取决于选择存储的方法取任何维度)。 矩阵标题大小是恒定的,但是矩阵本身的大小可能随图像而变化,并且通常大几个数量级。
OpenCV是一个图像处理库。 它包含大量图像处理功能。 为了解决计算挑战,大多数时候您最终会使用库的多个功能。 因此,将图像传递给函数是一种常见的做法。 我们不应该忘记我们正在讨论图像处理算法,这些算法往往计算量很大。 我们要做的最后一件事是通过制作不必要的潜在大图像副本来进一步降低程序的速度。
为解决此问题,OpenCV使用引用计数系统。 这个想法是每个Mat对象都有自己的头,但是矩阵可以通过让它们的矩阵指针指向同一个地址来共享它们的两个实例。 此外,复制操作符只会将标题和指针复制到大矩阵,而不是数据本身。
最后